2015-03-20 1 views
-2

Я попытался это:Строка инициализируется как « 0» в C?

char s[100]; 

for(int i=0; i<100; i++) { 
if(*(s+i) == '\0') 
    printf("end of string\n"); 
} 

и «конец строки» будет напечатанных в 96 раз. если я изменил определение строки на char * s [120]; Я получу «конец строки» 100 раз

Почему? как строка точно инициализируется.

Я пытаюсь проверить каждые 3 символа в строке, необходимо, чтобы проверил, что произойдет, если мой указатель передаст конец строки.

Редактировать: извините, опечатка. должен быть char s [100] вместо char * s [100]

+1

Вы понимаете, что вы объявляете массив указателей на символы, а не массив символов или строки? – AntonH

+0

Чтобы быть понятным, ваша петля показывает, что первые 100 элементов массива имеют значение '0'. Увеличение длины массива не изменило этого. Без полного кода невозможно сказать * почему * все элементы массива являются '0' и даже если они явно не инициализированы (например, с символом' char * s [100] = {0}; 'или неявно объявив его массивом gobal, вам может быть повезло * при поиске всех элементов '0'. BTW-тестирование с' '\ 0'' не делает массив указателей массивом символов,' '\ 0'' не является a 'char' оценивает значение' 0'. –

ответ

5

Если массив s является автоматической переменной, указатели в массиве имеют неопределенное значение. Они не инициализируются ничем, от которого вы не можете ссылаться или даже читать, не вызывая неопределенное поведение.

Примечание: у вас есть массив указателей, а не «строка».

+1

Уведомление для новичков: * Автоматическая * переменная - это переменная, объявленная внутри функции, которая не объявлена ​​'static' или' extern' или '_Thread_local'. Автоматические переменные обычно не имеют спецификатора класса хранения, но они могут быть объявлены как 'auto' или' register'. – fuz

0

Линия

char *s[100]; 

определяет s как массив указателей на строки, а не в виде строки. Вероятно, вы должны использовать

char s[100]; 

вместо этого.

Если вы используете исходное определение, вы используете * (s + i) == '\ 0', тогда вы сравниваете указатель на строку с символом '\ 0'. Вы действительно не хотите этого делать, даже если он компилируется.

Что касается того, почему вы получаете 96 раз, конец строки состоит в том, что значения указателей могут быть инициализированы для любых данных, потому что вы их явно не инициализировали.

1

Если char s[100]; объявлен в глобальном масштабе, он будет обнулен, если он находится в автоматическом режиме, он будет содержать все остатки мусора в стеке (как правило) ... но он не определен, если вы находитесь в место, где вы инициализации переменной вы можете использовать сокращенную запись ...

char s[100] = {0};

если это переменная вы повторно, то вы, возможно, придется использовать memset ...

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

+0

Имейте в виду, что OP имеет массив символов 'char *'. – juanchopanza

+0

Я предполагал, что это была опечатка –

Смежные вопросы