2013-03-22 16 views
7

Jestem prawdziwym początkującym użytkownikiem C, ale się uczę!Dziwna postać po tablicy znaków

Natknąłem się na ten problem wcześniej i postanowiłem zapytać, jaki jest tego powód. I proszę wyjaśnij swoje odpowiedzi, abym mógł się uczyć.

Zrobiłem program, który pozwala wprowadzić 5 znaków, a następnie pokazać znaki, które napisałeś, a także je odwrócić, na przykład: "asdfg" - "gfdsa". Dziwne jest to, że dziwna postać jest wyświetlana po wprowadzeniu oryginalnych znaków.

Oto kod:

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; 

Gdybym wpisać: "asdfg" pokazuje: "asdfg ♣", to dlaczego?

Dziękuję za poświęcony czas i proszę wyjaśnić swoje odpowiedzi :)

+2

Musisz zakończyć tablicę znaków. Zobacz http://stackoverflow.com/questions/10943033/why-are-strings-in-c-usually-terminated-with-0 –

Odpowiedz

2

ciąg str[5]; jest zbyt krótki.

Powinno być

str[6]; 

A gdy go wydrukować kod wychodzi poza granicę tej tablicy.

Należy również ustawić znak kończący o wartości NULL na tablicę str [], aby oznaczyć koniec tablicy.

str[5] = '\0' 
+0

'scanf()' ustawi terminator dla ciebie przy obchodzeniu się od ' Specyfikator formatu% s'. Mimo to należy przede wszystkim unikać "scanf()" w połączeniu z '% s', ponieważ jest to jednoznaczne zagrożenie przepełnienia bufora. Zamiast tego użyj 'fgets()'. – WhozCraig

15

Ponieważ nie ma żadnego terminatora zerowego. W C ciąg znaków to sekwencja ciągłych bajtów (znaków), które kończą się znakiem wartownika zwanym terminatorem o wartości null ('\0'). Twój kod pobiera dane wejściowe od użytkownika i wypełnia wszystkie 5 znaków, więc nie ma "końca" twojego ciągu znaków. Następnie, po wydrukowaniu ciągu znaków, wydrukuje on 5 znaków ("asdfg") i nadal będzie drukować, co będzie na stosie, dopóki nie trafi w terminator o wartości NULL.

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 

Zaletą o specificer formacie granica jest to, że nawet jeśli wejście jest dłuższe niż 5 znaków, tylko 5 będą przechowywane na Twoim łańcucha, zawsze pozostawiając miejsce dla tej zerowej terminatorem.