【问题标题】:Having trouble with the scanf() functionscanf() 函数有问题
【发布时间】:2011-03-19 07:03:06
【问题描述】:

我是 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.

关于我做错了什么的任何提示?我希望它在按下输入按钮后立即扫描。

【问题讨论】:

标签: c scanf


【解决方案1】:

这是因为scanf 会一直等到您输入两个整数(除非它收到错误或文件结尾)。在这种情况下,它不关心换行符的存在,它会将它们扔掉并等待另一个整数。

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

请参阅this answer,了解从标准输入获取行的安全方法。除此之外,只需稍作修改即可将您的 scanf (...) 变为 sscanf (buffer, ...)

【讨论】:

    【解决方案2】:
    scanf('%d %d'...
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • ever 有点过头了。有时想要有微妙的程序爆炸......感谢您的评论;我已经相应地更新了。
      猜你喜欢
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2011-07-21
      相关资源
      最近更新 更多