Каковы особенности определения строки в C? - PullRequest
10 голосов
/ 22 февраля 2020

Я должен ответить на домашнее задание для одного из моих занятий. В частности, я должен сказать, считаются ли определенные массивы в C строками или нет. На основании этой статьи (https://www.geeksforgeeks.org/strings-in-c-2/) я знаю, что строки - это массив символов с нулевым терминатором в конце.

Мое основное зависание является частью вопроса, который задает вопрос о массиве, который выглядит следующим образом:

char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };

Это, очевидно, массив символов с нулевым завершающим символом в конце. Тем не менее, считается ли он строкой, поскольку он также имеет нулевой завершающий символ в середине? Как это повлияет на строку?

РЕДАКТИРОВАТЬ: Основываясь на комментариях, я предоставил фактическую формулировку вопроса:

"Какой из следующих массивов может рассматриваться как" строки "для целей использования их в качестве аргументов для strcpy (), strncpy (), strcmp (), strncmp () и подобных строковых функций (указать все применимые)? "

РЕДАКТИРОВАТЬ: я написал об этом своему профессору по вопрос казался двусмысленно сформулированным (как отметили несколько человек). Если кому-то интересно, он сказал мне: «Да, это строка. Ключ в том, что есть нулевой символ. Но, конечно, это повлияет на любые строковые операции; строка заканчивается нулевым символом».

Ответы [ 3 ]

8 голосов
/ 22 февраля 2020

c1 в основном [1] эквивалентно &c1[0], который содержит одну строку, "CS".

Там скрывается вторая строка, "324", начиная с &c1[3] - но пока вы получаете доступ к c1 как c1, строка "CS" - это все функции strcpy() et al. будет видеть.


[1]: c1 это массив, &c1[0] это указатель.

2 голосов
/ 22 февраля 2020

Если вы хотите узнать особенности определения строки в C, go для источника.

Из стандарта C90 :

7 Библиотека

7.1 Введение

7.1.1 Определения терминов
A строка представляет собой непрерывную последовательность символов, оканчивающихся включая первый нулевой символ. «Указатель на» строку - это указатель на ее начальный (наименее адресуемый) символ. «Длина» строки - это количество символов, предшествующих нулевому символу, а ее «значение» - последовательность значений содержащихся символов в порядке.

(Не было соответствующих изменений в более поздних стандартах.)

Таким образом, c1 содержит две последовательные строки, "CS" и "324", но не является строкой.

Если мы передаем массив функции , он распадается на указатель на свой первый элемент, поэтому +c1 указывает на строку (первый), что достаточно для любой функции, ожидающей указатель на строку. Он не указывает на строку «CS \ 0324», но, вероятно, этого достаточно для вопроса инструкторов, что неоднозначно.

0 голосов
/ 22 февраля 2020

Добавление к ответу @ DevSolar чего-то, что я обнаружил после игры с заданной строкой, если бы это было:

char c1[] = { 'C', 'S', '\\0', '3', '2', '4', '\\0' };

Если вы выведете эту строку, вы получите CS03240 и размер этой строки равно 7. Насколько я понимаю, \\0 используется для обозначения нулевого символа ( т.е. \0). Если вы делаете:

printf("\0");

Вы ничего не видите в журнале вывода, но если вы делаете:

printf("\\0");

Вы видите \0, что-то ожидаемое, потому что для вывода специальных символов, таких как обратная косая черта или кавычки, вам необходимо использовать \ вместе с ними.

Что-то, что меня озадачивает, - это вывод CS03240 и его размер 7. Обычно считается, что размер строки - это количество символов в ней плюс один (для нулевого символа). Кроме того, размер равен 7 даже для строки, char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };.

Так что, может быть, продолжение этого вопроса, что здесь происходит?

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