Как строка заканчивается в C?

Я знаю, что строка в c будет заканчиваться символом \0.

Однако, если я сделаю char a[5] = "abcd\n" , где будет \0?

Или мне нужно зарезервировать хотя бы одну позицию для \0 всякий раз, когда я пытаюсь использовать char[] для хранения строки?

Спасибо за любую помощь!

Вам нужно зарезервировать одну позицию для \0. Итак, ваш массив должен быть a[6].

kiner_shah 16.02.2023 09:12

В вашем коде a не является строкой! Это просто статический байтовый буфер длиной 5, но в нем отсутствует нулевое завершение, которое превращало бы его в строку. C позволяет это (в C++ эта инициализация была бы недействительной).

Konrad Rudolph 16.02.2023 09:13

@kiner_shah Спасибо, и мне также интересно, что произойдет, если я настаиваю на использовании [5]? Могу ли я по-прежнему нормально использовать функции для строки?

Chen Yao 16.02.2023 09:13

Если ваша «строка» не завершается нулем, это не строка.

Jabberwocky 16.02.2023 09:15

@KonradRudolph Спасибо! Так будет ли ``` char a[5] = "abcd"``` рассматриваться как строка?

Chen Yao 16.02.2023 09:15

Как говорит @KonradRudolph, массив не является строкой в ​​том смысле, в каком его ожидают все стандартные строковые функции C, потому что у него нет терминатора. Итак, если вы передадите его, например. strlen то вы получите неопределенное поведение.

Some programmer dude 16.02.2023 09:15

@ChenYao Да, в этом случае это строка.

Konrad Rudolph 16.02.2023 09:15
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
2
7
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ты должен сделать:

char a[] = "abcd\n";

Без указания размера, чтобы позволить компилятору определить размер буфера. Фактический буфер будет иметь размер 6, чтобы вместить ваши 5 байтов + 1 байт для завершающего нуля. Когда вы вводите «что-то» без присваивания, компилятор помещает эту строку в выделенное место в программе, по крайней мере, с 1 нулевым байтом после последнего символа.

Письмо символ а[5]="abcd\n" является плохой практикой, потому что это приведет к тому, что такие функции, как strcpy(), будут действовать неопределенным образом, поскольку ваша переменная 'a' не является строкой c, а просто буфером символов, которые случайно кажутся все печатаемыми/видимыми + завершающими \n

Другие вопросы по теме