2013-12-11 12 views
5

Mam problem z pętlą, nie wiem dlaczego, ale pętla nigdy się nie kończy.sprintf w C, pętla nigdy się nie kończy

int main(int argc, char *argv[]) 
{ 
    int j; 
    char s[2]; 
    for(j=1;j<=3;j++) 
    { 
     sprintf(s,"s%d",j); 
     printf("%s", s); 
    } 
    system("PAUSE");  
    return 0; 
} 

Myślę, że pętla powinna pokazywać s1s2s3 w konsoli.

+0

Wspaniały przykład pytania. SSCCE, oczekiwany wynik, faktyczny wynik. Nic dodać nic ująć. –

+2

[Niezdefiniowane zachowanie] (http://en.wikipedia.org/wiki/Undefined_behavior) –

Odpowiedz

8

char s[2]; powinien być char s[3];, inaczej otrzymasz przepełnienie bufora.


Abhineet wyjaśnia, dlaczego zmiana jest konieczna. Jednak, aby potwierdzić odpowiedź, oto odpowiednia część normy.

7.19.6.6

Funkcja sprintf odpowiada fprintf wyjątkiem tego, że moc opisana w tablicy (Określonego argument S), a nie do strumienia. Znak zerowy jest zapisany na końcu znaków napisane; nie jest liczony jako część zwracanej wartości. Jeśli kopiowanie odbywa się między obiektami, które się nakładają, zachowanie jest niezakończone.

+0

dzięki, teraz działa dobrze :) – user3014282

+0

jeśli odpowiedź ci pomogła, nie zapomnij o tym. –

+1

Możesz zaakceptować odpowiedź w 7 minut (było 15) ... – user3014282

4

Z documentation,

Wielkość buforu powinna być na tyle duża, aby pomieścić cały łańcuch znaków.

Jesteś już popychając dwa znaki na s, więc nie ma wystarczająco dużo miejsca na dołączenie \0. Spowoduje to niezdefiniowane zachowanie . Rozwiązaniem jest zapewnienie dodatkowej pamięci dodatkowej do dołączenia \0.

char s[2]; do char s[3];

wiem, że mam odpowiedział dość późno, ale nie mógł się powstrzymać od wyjaśniając OP „Dlaczego on musi używać s [3] zamiast s [2]?”

+0

Nieważne, znalazłem to w standardzie. –

Powiązane problemy