2016-10-09 2 views
0

Я новичок в c, и я не уверен, как сформулировать этот вопрос. Но, к примеру, используя этот код:Как избежать пользовательских входов от перехода, используя два scanf?

#include <stdio.h> 

int main() 
{ 
    int x,y,z; 

    printf("Enter 2 numbers: "); 
    scanf("%d %d", &x, &y); 

    printf("Test: "); 
    scanf("%d",&z); 

    printf("x:%d y:%d z:%d\n",x,y,z); 

    return 0; 
} 

Если пользователь вводит "1 2 3", было бы установить х = 1, Y = 2 и г = 3. Мне было интересно, можете ли вы установить x = 1 и y = 2 и проигнорировать 3, тогда пользователь может ввести другое значение и не использовать 3, указанных ранее.

+6

Вы можете сбросить ввод после первого сканированияf. [См. Здесь] (http://stackoverflow.com/questions/7898215/how-to-clear-input-buffer-in-c). –

+5

Вы можете использовать ['fgets()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html) (или POSIX ['getline()'] (http: //pubs.opengroup .org/onlinepubs/9699919799/functions/getline.html)), чтобы прочитать строку, а затем сканировать ее с помощью ['sscanf()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sscanf.html) вместо 'scanf()'. Это часто лучший способ обработки данных; он позволяет лучше сообщать о ошибках и позволяет вам попробовать альтернативные способы сканирования данных, если первый формат не работает. –

+1

Полностью согласен с @JonathanLeffler: вы должны использовать 'fgets()' для получения одной строки, а затем 'sscanf()' для ее тщательной обработки (проверка значений возврата из этих функций, конечно). –

ответ

0

Этот код поможет вам:

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int x,y,z; 
    char s[1024]; 

    printf("Enter 2 numbers: "); 
    scanf("%d %d", &x, &y); 
    fgets(s, 1024, stdin); 

    printf("Test: "); 
    scanf("%d",&z); 

    printf("x:%d y:%d z:%d\n",x,y,z); 

    return 0; 
} 

Он инициализирует указатель на строку с 1024 bytes и после прочтения первых двух целых чисел игнорировать оставшееся содержимое на этой линии, а затем предлагает Test: и читает z переменную.

EDIT Используйте код ниже, поскольку я тестировал его с помощью строки 0 <= lentgh <= 8.1k characaters!

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int x,y,z; 
    char ch; 

    printf("Enter 2 numbers: "); 
    scanf("%d %d", &x, &y); 
    while(scanf("%c", &ch)) if(ch == '\n') break; 

    printf("Test: "); 
    scanf("%d",&z); 

    printf("x:%d y:%d z:%d\n",x,y,z); 

    return 0; 
} 
+1

Никогда не используйте 'gets()'. Никогда, никогда, никогда! –

+0

@JonathanLeffler, дайте мне альтернативный ':)'. –

+0

См. [Почему 'gets()' настолько опасен, что его не следует использовать - когда-либо] (http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should-it-not-be-used) для списка альтернатив. –

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