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