Я должен ответить на домашнее задание для одного из моих занятий. В частности, я должен сказать, считаются ли определенные массивы в C строками или нет. Основываясь на этой статье ( https://www.geeksforgeeks.org/strings-in-c-2/ ), я знаю, что строки - это массив символов с нулевым терминатором в конце.
Мое основное зависание является частью вопроса, который задает вопрос о массиве, который выглядит следующим образом:
char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
Это, очевидно, массив символов с нулевым завершающим символом в конце. Однако считается ли он строкой, поскольку в середине также есть нулевой завершающий символ? Как это повлияет на строку?
РЕДАКТИРОВАТЬ: На основе комментариев, я представил фактическую формулировку вопроса:
«Какие из следующих массивов можно считать« строками »в целях использования их в качестве аргументов функций strcpy (), strncpy (), strcmp (), strncmp () и аналогичных строковых (указать все применимые)?»
РЕДАКТИРОВАТЬ: я написал своему профессору по электронной почте об этом, так как вопрос казался неоднозначным (как отметили несколько человек). Если кому-то любопытно, он сказал мне: «Да, это строка. Ключ в том, что есть нулевой символ. Но, конечно, это повлияет на любые строковые операции; строка заканчивается нулевым символом».
источник
"CS"
с добавленными несколькими байтами мусора (в этом случае последний символ NUL не имеет значения). Но это не строка «в целом». - Тем не менее, передача этого иstrcpy
т. Д. Не заставит ваш компьютер взорваться, потому что эти функции будут «видеть» только"CS"
часть.strcmp()
. Возможность его использования в качестве аргумента для мутирующих строковых функций зависит от дополнительных факторов, которые не указаны.c1
является изменчивым, поэтому я не понимаю, почему он не может быть действительным целевым аргументом дляstrcpy
или подобным, если только он не был достаточно большим, чтобы вместить исходную строку. Это не сделало бы это не строкой, просто не подходящей для данной цели.c1
будет удовлетворять основным требованиям для строковых аргументов для всех (узких) строковых функций стандартной библиотеки, включая все специально названные, но поведение может не соответствовать ожидаемому или желающему вызывающему (даже игнорируя неопределенные поведения, которые могут быть вызваны).char
. Подойдет любой тип символов .Ответы:
c1
в основном [1] эквивалентно&c1[0]
, который держит одну строку,"CS"
.Там скрывается вторая строка
"324"
, начиная с&c1[3]
- но до тех пор, пока вы обращаетесьc1
к нейc1
, строка"CS"
- это все функцииstrcpy()
и др. увидит.[1]:
c1
это массив,&c1[0]
это указатель.источник
c1
в качестве целевой строки вstrcpy()
команде? Вопрос неоднозначный - в лучшем случае.c1
качестве аргументаstrcpy()
. Это совершенно обычная строка во всех смыслах. Обычные строки часто содержат остатки мусора после их терминаторов. Тот факт, что этот мусор жестко запрограммирован в программе, создает впечатление, что автор намерен использоватьc1
нестроковые способы, но это не было частью вопроса.c1
эквивалентно&c1[0]
» вводит в заблуждение.c1
это массив.&c1[0]
это указательЕсли вы хотите узнать особенности определения строки в C, перейдите к источнику.
Из стандарта C90 :
(Не было соответствующих изменений в более поздних стандартах.)
Таким образом,
c1
содержит две последовательные строки, «CS» и «324», но не является строкой.Если мы передаем массив функции, он распадается на указатель на свой первый элемент, таким образом,
+c1
указывает на строку (первый), что достаточно для любой функции, ожидающей указатель на строку. Он не указывает на строку «CS \ 0324», но, вероятно, этого достаточно для вашего вопроса инструкторов, что неоднозначно.источник
+c1
указывает на строку, потому чтоc1
начинается со строки. Это никоим образом не формирует или формируетc1
строку, хотя.В добавление к ответу @ DevSolar я обнаружил кое-что после игры с заданной строкой, если бы это было так:
Если вы выведете эту строку, вы получите,
CS03240
и размер этой строки равен 7. Насколько я понимаю,\\0
используется для обозначения нулевого символа ( то есть\0
). Если вы делаете:Вы ничего не видите в выходном журнале, но если вы делаете:
Вы видите
\0
что-то ожидаемое, потому что для вывода специальных символов, таких как обратная косая черта или кавычки, вы должны использовать\
вместе с ними.Что-то, что озадачивает меня, - это вывод
CS03240
и его размер 7. Принято считать, что размер строки - это количество символов в ней плюс один (для нулевого символа). Кроме того , размер 7 даже для строкиchar c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
.Так что, возможно, продолжение этого вопроса, что здесь происходит?
источник
'\\0'
не нулевой символ . Это многосимвольная константа. Он имеет значение, определенное реализацией, определенно вне диапазонаchar
.c1[]
не является строкой, так как в ней отсутствует нулевой символ . «Вы выводите эту строку», вероятно, приводит к неопределенному поведению .char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
имеет размер 7, потому что он инициализируется 7 значениями. Это не размер имеет ничего общего с строками .char c1[] = { 1, 2, 3, 4, 5, 6, 7 };
все равно сделает его размером 7.c1
содержит жало? Это отдельная проблема. Смотрите также