2016-03-22 11 views
1

Вот мой код для повторного чтения трех переменных, разделенных пробелами от пользователя. Формат ввода должен быть «char int int» (например, b 3 3). Я использую возвращаемое значение функции scanf для обеспечения ввода в точности трех переменных.Возвращаемое значение scanf()

#include <stdio.h> 

int main(void){ 
    int x, y, nargs; 
    char command; 

    while(1){ 
    nargs = scanf("%c %d %d", &command, &x, &y); 
    printf("%d\n",nargs); 

    if(nargs != 3){ 
     printf("error\n"); 
     break; 
    } 
    } 
    return 0; 
} 

вход и выход:

g 4 4 
3 
b 3 3 
1 
error 

В первой строке входных проблем нет. Но когда я ввожу вторую строку, она показывает, что scanf() считывает только одну переменную из этой строки. В чем проблема моего кода?

+3

''% c% d% d "' - быстрый ответ. Используя 'fgets()', а затем 'sscanf (buf,«% c% d% d », ...' лучше. GTG – chux

ответ

2

Проблема заключается в том, что новая строка текста не указана между двумя входными строками, которые вы отправляете на stdin. После первого scanf у вас есть '\n' в ожидании входного потока, тогда вы добавляете "b 3 3", поэтому весь буфер выглядит как "\nb 3 3".

Затем scanf вызывается снова и \n подобран к %c, после того, как scanf ожидает пробельные но буфер имеет 'b' поэтому не удается после назначения \n к command.

Вы можете попробовать соответствие с

nargs = scanf("%c %d %d ", &command, &x, &y); 
        ^

так, что символ новой строки съеденного с предыдущим scanf из cppreference:

любой одиночный символ пробела в строке формата потребляет все доступные последовательные пробельные символы ввод

+0

Получил это! Но есть новая проблема, он не может прочитать мой первый ввод строки. Я должен ввести g 4 4 \ nb 3 3 \ n, тогда обратная связь программы 3 мне. –

+1

Используйте ''% c% d% d "' не '"% c% d% d "' Необходимое пространство в начале. имеет проблемы – chux

-2
nargs = scanf("%1s %d %d", &command, &x, &y); 

Проблема с %c для одного символа. Если вы измените его на %1s, вы ожидаете строку одного символа (то же самое), но без проблем.

С %c лучше отправить результат в массив и получить доступ к контенту с его индексом.

+1

''% 1s "' - плохая идея с 'char command;' - переполнение буфера. – chux

+2

Чтобы развернуть комментарий @ chux, '% 1s' читает в односимвольную строку *, которая занимает два байта , один для данных и один для терминатора '' \ 0''. –