Почему str[0] = 0 удаляет все строки в массиве?

#c

#c

Вопрос:

данный код является:

 int main() {  char *str = "hello world";  str[0] = 0;  printf("%sn", str); //prints nothing }  

Я знаю, что не могу редактировать часть строки, например ‘str[5] = ‘w;’,

поэтому я подумал, что строка 4 ‘str[i] = 0;’ будет работать так.

Но, похоже, он очищает строку и, таким образом, ничего не печатает.

Может кто-нибудь, пожалуйста, объяснить, почему строка 4 работает именно так?

Комментарии:

1. Он устанавливает терминатор строки в первом элементе, т. е. в «пустой» строке. В остальном ничего не изменилось. (Но это строковый литерал, и вы не должны писать в него.)

2. Этот код демонстрирует неопределенное поведение , так как str указывает на постоянные данные. Строковые литералы обычно хранятся в памяти, доступной только для чтения.

3. Символ со значением «0» рассматривается как маркер окончания строк (массивы символов), поэтому при его размещении в позиции [0] длина строки будет равна 0.

4. Во-первых, вам нужно удалить неопределенное поведение, изменив char *str = его на char str[] = . Затем вы можете показать, что массив не был очищен, изменив параметр printf, на printf("%sn", str 1); который будет выполняться печать ello world .

5. Вы также можете распечатать весь массив for (int i = 0; i lt; 12; i ) printf("%dn", str[i]); , и вы увидите оба нуля: исходный ноль в конце массива и новый ноль, который строка 4 помещает в начало массива. 32 в середине-это символ пробела, а остальные цифры-строчные буквы.

Ответ №1:

0 или '' является нулевым символом.

На языке Си строка представляет собой массив char s, заканчивающийся нулем.

Таким образом, если вы поместите 0 самый первый элемент char массива, он будет представлять пустую строку (имеющую нулевую длину) при интерпретации как строка, заканчивающаяся нулем, например, %s спецификатором of printf() .

Но ваш код неверен, потому что вы не можете изменить строковый литерал. Вместо этого все должно быть больше похоже на это:

 int main() {  char str[] = "hello world";  str[0] = 0;  printf("%sn", str); //prints nothing }  

Комментарии:

1. «потому что вы не можете изменить строковый литерал» — ну, не в течение довольно долгого времени (1989, я полагаю). Kamp;R C позволяет вам делать практически все, что угодно 🙂

2. @stdunbar Kamp;R Я понятия не имею. Я не археолог (и даже не палеонтолог). но (Kamp;R2, Приложение C) «Строки больше не поддаются изменению и поэтому могут быть помещены в память, доступную только для чтения».