#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) «Строки больше не поддаются изменению и поэтому могут быть помещены в память, доступную только для чтения».