Почему нам не нужен цикл для печати строк в C? - PullRequest
0 голосов
/ 29 октября 2019

Я не понимаю, почему мы не должны печатать строки в цикле for? В обычных случаях нам нужно печатать массивы в цикле for. Например, если мы хотим вывести массив целых чисел. Это будет выглядеть так:

int a[n];

for (i = 0; i < n; i++){
    printf("%d", a[i]);
}

Но для таких строк, как:

char s[100] = " Hello ";
printf("%s\n", s);

достаточно написать имя массива. РЕДАКТИРОВАТЬ: Кажется, что я не задал свой вопрос должным образом, так как некоторые из вас написали ответы, которые не связаны с моим вопросом. Я редактирую свой вопрос.

Ответы [ 4 ]

2 голосов
/ 29 октября 2019

Строки заканчиваются пустым символом '\0', поэтому можно узнать, когда строка заканчивается, даже не передавая явно ее длину.

0 голосов
/ 29 октября 2019

Строки представляют собой несколько символов одновременно. Вы не можете запросить определенный символ из строки. Если вы хотите это сделать, вы должны обращаться к нему как к массиву символов, подобных этому

for (i = 0; i < n; i++){
     printf("%c", s[i]);
}
0 голосов
/ 29 октября 2019

Ваш пример далеко не аналогичен. %d относится к одиночному целому числу, а %s относится к целой (но все еще одиночной) строке.

Вы также не передаете размер массива n[] в printf - скорее, вы звоните printf n раз. Вы печатаете одну int точно так же, как вы печатаете одну строку.

Фактическая длина строки неизвестна априори , скорее printf выполняет итерацию строки, пока не встретит \0 терминатор. Эквивалентно:

for( int i = 0; s[i] != '\0'; i++)
{
    printf( "%c", s[i] ) ;
}

, потому что

char s[100] = " Hello ";

эквивалентно:

char s[100] = { ' ', 'H', 'e', 'l', 'l', 'o', ' ', '\0' } ;
0 голосов
/ 29 октября 2019

Разница в том, что строки в стиле C (которые являются массивами символов) заканчиваются нулями, тогда как массивы int обычно не заканчиваются нулями.

Теоретически, вы также можете создать массив int, который равен нулюзавершить и вывести это в цикле:

int a[] = {5,7,3,0};

while (i=0;a[i]!=0;i++)
{
   printf("%d",a[i])
}

Однако проблема с массивами int с нулевым символом в конце состоит в том, что число 0 может быть значимым значением, поэтому вы не можете быть уверены, что это действительно конецмассив, когда вы сталкиваетесь с этим значением. Однако для строк ASCII-код 0 не имеет значащего значения, поэтому вы можете быть достаточно уверены, что достигли конца строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...