Да, для функций требуются строки с нулевым символом в конце. Однако в приведенном выше примере действительно используются строки с нулевым символом в конце. Например, строка
char szKey[] = "apple";
Описывает строку, к которой добавлен нулевой терминатор, хотя это не сразу видно в исходном коде. Любой строковый литерал в C автоматически завершается нулем, даже если вы явно не помещаете запрос в себя (хотя есть исключение, как мы увидим через минуту).
Более того, в строке
gets (szInput);
Функция gets
автоматически добавляет нулевой терминатор в конец строки, которую она читает из консоли. Фактически, за немногими исключениями (такими как общеизвестно сложная функция strncat
), все функции манипуляции со строками в <string.h>
автоматически добавляют нулевой терминатор. В общем случае редко встречается строка с нулевым символом в конце, если вы сами явно не возитесь с байтами символа.
Тем не менее, есть много способов получить строки, которые не заканчиваются нулем. Например, если вы определите строку, подобную этой:
char hello[5] = {'h', 'e', 'l', 'l', 'o'}; /* Careful! */
Этот массив не будет заканчиваться нулем, потому что вы явно перечислили значения, которые вы хотели бы иметь. Это означает, что у вас есть массив символов, а не строка. Если вы попытались позвонить
printf("%s\n", hello);
Вы можете столкнуться с неопределенным поведением, потому что массив не заканчивается нулем.
Кроме того, если вы используете какие-либо необработанные процедуры манипулирования памятью, такие как memcpy
или memmove
, вам нужно быть осторожным, чтобы убедиться, что нулевой терминатор скопирован или задан явно, поскольку эти подпрограммы не имеют понятия нулевого -terminators.
Кроме того, один быстрый бит терминологии - NULL
обычно относится к нулевому указателю , то есть к указателю, который явно помечен как указывающий на отсутствие объекта. Нуль в нулевом терминаторе относится к символу с числовым значением 0 и является символом (не указателем), используемым для указания того, что конец строки достигнут. Хотя имена совпадают (и имеют сходство), лучше не путать их.
Надеюсь, это поможет!