2015-12-31 11 views
5

'gdy nie ma pomyślnych przyporządkowań' Wiem, że scanf zwraca 0, aby to zaznaczyć, ale czy to jedyna rzecz, która robi? to jest mój kod:kiedy scanf zwraca 0 wc i po prostu nie działa

#include<stdio.h> 
    int main(void) { 
     int val,x; 
     x=scanf("%d",&val); 
    if(x==1) 
     printf("success!"); 
    else{ 
     printf("try again\n"); 
     scanf("%d",&val); 
     } 
    return 0; 
} 

gdybym wprowadzić numer, to działa dobrze, ale jeśli mogę wprowadzić znak scanf już nie działa, to co ja dostać:

k 
    try again 
    process returned 0 (0x0) execution time :2.578 s 
    press any key to continue. 
    _ 

ten sposób, że nie pozwala mi wprowadzić nowej wartości, dlaczego tak jest? czy coś jest nie tak w kodzie? jeśli tak, jak mogę to naprawić? powinienem przestać używać scanf?

+3

Nie używaj 'scanf'. Użyj 'fgets()', aby odczytać całą linię, a następnie użyj 'sscanf' do przetworzenia danych w linii. – Barmar

+2

Nie należy również używać 'sscanf'. Użyj 'fgets()', aby przeczytać całą linię, a następnie użyj 'strtol' i przyjaciół, aby przetworzyć dane w linii. Tylko te funkcje są niezawodne w obliczu arbitralnie zniekształconego wejścia. – zwol

+0

dziękuję! spróbuję tych rozwiązań! –

Odpowiedz

7

Gdy scanf nie działa, nieprawidłowe dane pozostaną w strumieniu. Zanim będziesz mógł wprowadzić więcej danych, musisz najpierw przeczytać i odrzucić dane ze strumienia.

#include<stdio.h> 
int main(void) { 
    int val,x; 
    x=scanf("%d",&val); 
    if(x==1) 
     printf("success!"); 
    else{ 
     // Discard everything upto and including the newline. 
     while ((x = getchar()) != EOF && x != '\n'); 
     printf("try again\n"); 
     scanf("%d",&val); 
    } 
    return 0; 
} 
+0

Nie powinieneś uczyć ludzi używać 'scanf'; powinieneś zamiast tego nauczać alternatyw. Wiem, że wiesz, jakie one są. – zwol

+0

dziękuję bardzo! jeśli możesz po prostu wyjaśnić, co zrobiłeś, proszę! –

+0

@NousSaSmily, że 'x = gechar()' pobiera następny znak ze strumienia wejściowego. Pętla 'while' kontynuuje to tak długo, dopóki' x' nie jest 'EOF' i nie jest' \ n''. Jeśli 'x' jest równe' EOF' lub ''\ n'', program wyłamuje się z pętli' while'. –

3

Rodzina funkcji scanf są podzielone-as-określony i nie powinny być wykorzystywane do czegokolwiek.

poprawne sposób napisać ten program jest użycie getline, jeśli jest dostępny, lub fgets inaczej, aby przeczytać cały wiersz danych wejściowych użytkownika. Następnie użyj strtol, aby przekonwertować dane wejściowe na liczbę całkowitą maszyny, zwracając uwagę na błędy:

errno = 0; 
result = strtol(line, &endptr, 10); 
if (endptr == line || *endptr != '\n' || errno) 
    // invalid input 
+0

dziękuję za pomoc! spróbuję ! –

Powiązane problemy