Возникли проблемы с функцией scanf () - PullRequest
0 голосов
/ 19 марта 2011

Я довольно новичок в C, но у меня возникли некоторые проблемы с написанием программы, которая принимает пользовательский ввод. Вот код, с которым у меня проблемы:

int xPos, yPos;    
while(1)
{
        printf("Enter two integers: ");
        if(scanf("%d %d", &xPos, &yPos) == 2)
        {
            printf("success \n");
        }
        else
        {
            printf("fail");
        }

}

Пример прогона того, что я хочу, выглядит следующим образом:

Enter two integers: 4 4
success
Enter two integers: 13
fail
enter two integers: sda asd
fail

и он просто будет продолжать

Но я получаю:

Enter two integers: 4 4
success
Enter two integers: 13
5 (it goes onto a new line for me and I have to enter something else to make it keep going) 
fail
Enter two integers: sda asd
Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers: and on and on.. you get the idea.

Есть какие-нибудь намеки на то, что я делаю не так? Я хочу, чтобы он сканировал, как только нажата кнопка ввода.

Ответы [ 3 ]

1 голос
/ 19 марта 2011

Это потому, что scanf будет просто ждать, пока вы не введете два целых числа (если не получится ошибка или конец файла).В данном случае он не заботится о наличии новых строк, он отбрасывает их и ждет другого целого числа.

Если вы хотите обработать строк, , вам следует использовать fgetsчтобы получить строку, а затем sscanf, чтобы извлечь целые числа.

См. этот ответ для безопасного способа получения строк из стандартного ввода.Кроме того, это всего лишь небольшая модификация, чтобы превратить ваш scanf (...) в sscanf (buffer, ...).

0 голосов
/ 19 марта 2011

Это слабость scanf. Вместо этого используйте fgets (buf, sizeof buf, stdin), чтобы прочитать всю строку как текст, а затем используйте sscanf, чтобы попытаться извлечь значения из строки.

Если данные хорошо себя ведут, gets() также может использоваться. Но, как справедливо указывает кто-то, буфер, используемый с gets(), может легко привести к неприятным переполнениям буфера.

0 голосов
/ 19 марта 2011
scanf('%d %d'...

продолжает сканировать стандарт, пока не увидит два целых числа, которые он ищет. Одним из решений является попытка взять строку и затем использовать atoi, чтобы выяснить, находится ли она в правильном формате, хотя возможно, что есть лучшее решение.

...