2013-03-22 3 views
7

Я настоящий новичок в C, но я учусь!Странный символ после массива символов

Я уже наткнулся на эту проблему и решил спросить, в чем причина. И, пожалуйста, объясните свои ответы, чтобы я мог учиться.

Я создал программу, которая позволяет вводить 5 символов, а затем показывать персонажи, которые вы написали, а также их вернуть, например: «asdfg» - «gfdsa». Странно, что странный символ отображается после ввода исходных символов.

Вот код:

char str[5]; 
char outcome[] = "OOOOO"; 
int i; 
int u; 

printf("Enter five characters\n"); 

scanf("%s", str); 

for(i = 4, u = 0; i >=0; u++, i--){ 
    outcome[i] = str[u]; 
} 

printf("\nYou wrote: %s. The outcome is: %s.", str , outcome); 


return 0; 

Если я ввожу: "Asdfg" показывает: "Asdfg ♣", почему это?

Спасибо за ваше время и, пожалуйста, объясните ваши ответы :)

+2

Вам необходимо завершить массив символов. См. Http://stackoverflow.com/questions/10943033/why-are-strings-in-c-usually-terminated-with-0 –

ответ

2

Ваша строка str[5]; является слишком коротким.

Это должно быть

str[6]; 

И при печати код выходит из границы этого массива.

Вы также должны установить нулевой символ завершения в str [] массив, чтобы пометить конец массива.

str[5] = '\0' 
+0

'scanf()' будет устанавливать терминатор для вас при обработке ' Спецификатор формата% s'. Тем не менее, следует избегать «scanf()» в сочетании с «% s», поскольку это явная и настоящая опасность переполнения буфера. Вместо этого используйте 'fgets()'. – WhozCraig

15

Потому что нет нулевого терминатора. В C «строка» представляет собой последовательность непрерывных байтов (символов), которые заканчиваются символом-дозорным, называемым нулевым терминатором ('\0'). Ваш код вводит данные пользователя и заполняет все 5 символов, поэтому в конце строки нет конца. Затем, когда вы напечатаете строку, она напечатает ваши 5 символов ("asdfg"), и она продолжит печать всякого мусора в стеке до тех пор, пока не ударит нулевой ограничитель.

char str[6] = {'\0'}; //5 + 1 for '\0', initialize it to an empty string 
... 
printf("Enter five characters\n"); 
scanf("%5s", str); // limit the input to 5 characters 

Хорошая вещь о предельном формате specificer является то, что даже если на входе больше, чем 5 символов, будет сохранено только 5 в вашу строку, всегда оставляя место для этого нулевого терминатора.

Смежные вопросы