Я хочу знать, почему строка d
становится abce после abcg0, поскольку ее размер составляет всего 5. В чем причина? Пожалуйста, помогите мне.
#include <stdio.h>
int main()
{
char a[] = "abcd";
char b[50] = "abce";
char c[] = {'a', 'b', 'c', 'f'};
char d[5] = {'a', 'b', 'c', 'g', '0'};
printf("%s",d);}
Ваш код недействителен C и приведет к неопределенному поведению.
Это связано с тем, что ваши первые две строки (a
и b
) заканчиваются нулем, а последние две строки (c
и d
) — нет.
Когда вы инициализируете строки с помощью двойных кавычек (как в первых двух случаях — a
и b
), строка автоматически завершается нулем.
Если вы инициализируете строку как массив (как в последних двух случаях — c
и d
), она не завершается нулем. Вы должны обнулить его самостоятельно.
В C нулевой символ представлен как '\0'
.
Следовательно, в случае переменных c
и d
допустимыми инициализациями будут:
char c[] = {'a', 'b', 'c', 'f', '\0'};
char d[5] = {'a', 'b', 'c', 'g', '\0'};
Альтернатива:
Его также можно инициализировать следующим образом:
char c[] = {'a', 'b', 'c', 'f', 0};
char d[5] = {'a', 'b', 'c', 'g', 0};
В этом случае строки также будут заканчиваться нулем. Это работает, поскольку 0 — это код ASCII для нулевого символа \0
.
Вот почему вы видите вывод «abcg0abce»:
Несмотря на то, что код недействителен, printf
попытается распечатать строку, которую вы ему сказали (но %s
полагается на то, что строка завершается нулем!) При этом он продолжает печатать символ за символом, пока не достигнет первое появление '\0'
в памяти. В вашем случае строка b
оказалась рядом со строкой d
в памяти - следовательно, это то, что печатается. Однако это не гарантируется, и это очень легко изменить, настроив флаги компиляции.
В массив символов вы должны добавить этот символ '\ 0'
Длина массива не влияет на длину строки, при печати строки printf печатает строку посимвольно до последнего символа перед '\0' (printf не печатает '\0')
#include <stdio.h>
int main()
{
char a[] = "abcd";
char b[50] = "abce";
char c[] = {'a', 'b', 'c', 'f','\0'};
char d[10] = {'a', 'b', 'c', 'g', '0','\0'};
printf("%s\n",d);
}
Пожалуйста, скопируйте и вставьте свой код в редактор и примените форматирование кода. Не размещайте текст в виде изображений.