C Строка Null Zero? - PullRequest
       1

C Строка Null Zero?

3 голосов
/ 13 декабря 2010

У меня есть основной вопрос программирования на C, вот ситуация. Если я создаю массив символов и если я хочу обработать этот массив как строку, используя код преобразования% s, я должен включить нулевой ноль. Пример:

char name[6] = {'a','b','c','d','e','f'};
printf("%s",name);

Вывод консоли для этого:

abcdef

Обратите внимание, что нулевой ноль не является последним элементом в массиве, но я все еще печатаю это как строку.

Я новичок в программировании ... Итак, я читаю книгу C для начинающих, в которой говорится, что, поскольку я не использую нулевой ноль в последнем элементе, я не могу рассматривать его как строку.

Это тот же вывод, что и выше, хотя я включаю ноль ноль.

char name[7] = {'a','b','c','d','e','f','\0'};
printf("%s",name);

Ответы [ 5 ]

5 голосов
/ 13 декабря 2010

Тебе просто везет;вероятно, после конца этого массива в стеке есть ноль, поэтому printf прекращает чтение сразу после последнего символа.Если ваша программа очень короткая и эта зона стека все еще «неисследована» - то есть стек еще не вырос до этой точки - очень легко, что она равна нулю, поскольку в целом современные ОС дают изначально обнуленные страницы приложениям.1002 *

Более формально: не имея явно терминатора NUL, вы попадаете в страну неопределенного поведения, что означает, что все может произойти;Это может быть и то, что ваша программа работает нормально, но это просто удача - и это наихудший тип ошибки, поскольку, если она в целом работает нормально, ее трудно обнаружить.сделать это.Придерживайтесь того, что гарантированно работает, и вы не будете вносить скрытые ошибки в свое приложение.

3 голосов
/ 13 декабря 2010

Вывод вашего кулака printf непредсказуем, в частности, потому что вы не смогли включить завершающий нулевой символ.Если кажется, что он работает в вашем эксперименте, это только потому, что по случайной случайности следующий байт в памяти оказался нулевым и работал как нулевой терминатор.Вероятность того, что это произойдет, сильно зависит от того, где вы объявите свой массив name (это непонятно из вашего примера).Для статического массива шансы могут быть довольно высокими, в то время как для локального (автоматического) массива вы будете сталкиваться с различным мусором, который печатается довольно часто.

2 голосов
/ 13 декабря 2010

Вы должны включать нулевой символ в конце.

Это сработало без ошибок из-за удачи и только везения.Попробуйте это:

char name[6] = {'a','b','c','d','e','f'};
printf("%s",name);
printf("%d",name[6]);

Скорее всего, вы увидите, что вы можете прочитать эту память, и в ней есть ноль.Но это просто удача.

0 голосов
/ 13 декабря 2010

Да.Ты сделаешь.Есть несколько других способов сделать это.

Эта форма инициализации автоматически вводит для вас символ NUL.

char name[7] = "abcdef";
printf("%s",name);

Обратите внимание, что я добавил 1 в размер массиваосвободите место для этого NUL.

Также можно обойтись без пропуска размера и предоставления компилятору возможности выяснить его.символ.

char *name = "abcdef";
printf("%s",name);
0 голосов
/ 13 декабря 2010

Скорее всего, произошло то, что в имени ячейки памяти было значение 0. Это не определенное поведение, однако вы можете получить другой вывод в другой системе или с другим компилятором.

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