Я знаю, что строка в c будет заканчиваться символом \0.
Однако, если я сделаю char a[5] = "abcd\n" , где будет \0?
Или мне нужно зарезервировать хотя бы одну позицию для \0 всякий раз, когда я пытаюсь использовать char[] для хранения строки?
Спасибо за любую помощь!
В вашем коде a не является строкой! Это просто статический байтовый буфер длиной 5, но в нем отсутствует нулевое завершение, которое превращало бы его в строку. C позволяет это (в C++ эта инициализация была бы недействительной).
@kiner_shah Спасибо, и мне также интересно, что произойдет, если я настаиваю на использовании [5]? Могу ли я по-прежнему нормально использовать функции для строки?
Если ваша «строка» не завершается нулем, это не строка.
@KonradRudolph Спасибо! Так будет ли ``` char a[5] = "abcd"``` рассматриваться как строка?
Как говорит @KonradRudolph, массив не является строкой в том смысле, в каком его ожидают все стандартные строковые функции C, потому что у него нет терминатора. Итак, если вы передадите его, например. strlen то вы получите неопределенное поведение.
@ChenYao Да, в этом случае это строка.
Ты должен сделать:
char a[] = "abcd\n";
Без указания размера, чтобы позволить компилятору определить размер буфера. Фактический буфер будет иметь размер 6, чтобы вместить ваши 5 байтов + 1 байт для завершающего нуля. Когда вы вводите «что-то» без присваивания, компилятор помещает эту строку в выделенное место в программе, по крайней мере, с 1 нулевым байтом после последнего символа.
Письмо символ а[5]="abcd\n" является плохой практикой, потому что это приведет к тому, что такие функции, как strcpy(), будут действовать неопределенным образом, поскольку ваша переменная 'a' не является строкой c, а просто буфером символов, которые случайно кажутся все печатаемыми/видимыми + завершающими \n
Вам нужно зарезервировать одну позицию для \0. Итак, ваш массив должен быть a[6].