Можно ли считать все строки массивом символов ( Да ), можно ли считать все массивы символов строками ( Нет ).
Почему бы нет? и почему это важно?
В дополнение к другим ответам, объясняющим, что длина строки нигде не хранится как часть строки, и ссылкам на стандарт, где определяется строка, оборотной стороной является «Как функции библиотеки C обрабатывают строки?»
Хотя массив символов может содержать одинаковые символы, он представляет собой просто массив символов, если за последним символом не стоит завершающий нулем символ. Этот завершающий нуль символ - это то, что позволяет массиву символов считаться (обрабатываться как) строкой.
Все функции в C, которые ожидают строку в качестве аргумента, ожидают, что последовательность символов будет оканчиваться нулем . Почему?
Это связано с тем, как работают все строковые функции. Поскольку длина не включена как часть массива, строковые функции сканируют в массиве до тех пор, пока не будет найден нуль-символ (например, '\0'
- эквивалент десятичного числа 0
). Смотрите таблицу ASCII и описание . Независимо от того, используете ли вы strcpy
, strchr
, strcspn
и т.д .. Все строковые функции полагаются на NUL оконечного характера присутствуя определить , где конец этой строки есть.
Сравнение двух похожих функций из string.h
подчеркивает важность нулевого завершающего символа. Взять, к примеру:
char *strcpy(char *dest, const char *src);
strcpy
Функция просто копирует байты из src
к dest
до NUL оконечного символ не найдено рассказывая , strcpy
где остановить копирование символов. Теперь возьмите похожую функцию memcpy
:
void *memcpy(void *dest, const void *src, size_t n);
Функция выполняет аналогичную операцию, но не считает или требует, чтобы src
параметр был строкой. Так как memcpy
при src
копировании байтов не удается просто выполнить перемотку вперед до dest
тех пор, пока не будет достигнут нулевой завершающий символ, ему требуется явное количество байтов для копирования в качестве третьего параметра. Этот третий параметр обеспечивает memcpy
ту же информацию о размере, которую strcpy
можно получить, просто сканируя вперед, пока не будет найден нулевой завершающий символ.
(который также подчеркивает, что идет не так strcpy
(или любую функцию, ожидающую строку), если вы не можете обеспечить функцию строкой с нулевым символом в конце - он понятия не имеет, где остановиться, и с удовольствием прыгнет через оставшуюся часть вашего сегмента памяти вызывая неопределенное поведение до тех пор, пока nul-символ просто не будет найден где-то в памяти - или не произойдет ошибка сегментации)
Вот почему функциям, ожидающим строку с нулевым символом в конце, должна быть передана строка с нулевым символом в конце и почему это важно .
char str[] = "hello";
случай.