Можно ли считать все строки массивом символов ( Да ), можно ли считать все массивы символов строками ( Нет ).
Почему бы нет? и почему это важно?
В дополнение к другим ответам, объясняющим, что длина строки нигде не хранится как часть строки, и ссылкам на стандарт, где определяется строка, оборотной стороной является «Как функции библиотеки 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";случай.