使用scanf()函数时遇到问题

时间:2011-03-19 07:03:06

标签: c scanf

我对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 个答案:

答案 0 :(得分:1)

那是因为scanf只会等到你输入两个整数(除非它得到错误或文件结束)。它不关心在这种情况下是否存在换行符,它会抛弃它们并等待另一个整数。

如果你想处理行,,你应该使用fgets来获取一行,然后使用sscanf来提取整数。

有关从标准输入获取线路的安全方法,请参阅this answer。除此之外,只需稍加修改即可将scanf (...)转换为sscanf (buffer, ...)

答案 1 :(得分:0)

scanf('%d %d'...

继续扫描标准,直到它看到它正在寻找的两个整数。一种解决方案是尝试接受一个字符串然后使用atoi来确定它是否采用正确的格式,尽管可能有更好的解决方案。

答案 2 :(得分:0)

这是scanf的弱点。而是使用fgets(buf,sizeof buf,stdin)将整行读作文本,然后使用sscanf尝试从行中提取值。

如果数据表现良好,也可以使用gets()。但正如有人正确指出的那样,与gets()一起使用的缓冲区很容易导致令人讨厌的缓冲区溢出。