【问题标题】:Scanf a char using %d使用 %d 扫描一个字符
【发布时间】:2017-11-23 10:33:23
【问题描述】:

我在下面有一个特定示例,如果输入整数(请参阅输出 1),它工作得非常好,当我尝试在 scanf 函数调用中使用 %d 说明符扫描字符时,我得到下面的输出 2。

所以,我的问题是,如果输入一个 char,我希望类型说明符应该将其转换为等效的 int 值,如果不是垃圾值,即使在任何一种情况下它都应该打印/段错误。但是,在这里我得到了连续的打印,我觉得这是错误的,因为 scanf 每次都被绕过。我很不确定后台发生了什么,我也想知道。

#include <stdio.h>

int main()
{

   int a;

   while (1){
       printf("enter a number:");
       scanf("%d", &a);
       printf("entered number is %d\n", a);
   }

return 0;
}

输出 1

>     enter a number:1
>     entered number is 1
>     enter a number:
>     3
>     entered number is 3
>     enter a number:4
>     entered number is 4
>     enter a number:5
>     entered number is 5 enter a number:

输出2:用于输入a

>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767

PS:我知道这是一个愚蠢的问题,询问在无效的情况下会发生什么,其中类型说明符意外(在这种情况下为 %d)用于不同的类型,但我想知道在后台发生了什么,如果有的话。谢谢

【问题讨论】:

  • 简短的故事:如果输入与格式不匹配,则scanf 会提前返回(检查调用返回的内容!总是!)将输入留在缓冲区中。
  • 在后台(实际上就在你面前,但你忽略它)scanf 告诉你它没有成功读取一个整数。返回值携带该信息。
  • "%d" 需要像 (white-spaces)(sign)[digits] 这样的数字输入。如果用户不输入,则不会读取任何内容,并且文本会保留在 stdin 中以供下一个输入函数使用 - 使用您的代码,错误的输入会导致无限循环,因为有问题的文本永远不会被消耗。
  • %d 不会读取字符。为此,您需要使用 %c。
  • "if input a char" ---> 提示:“char”是指字母。在 C 中,char 是 1 字节的类型。 scanf() 不读取字符,而是字符。一些字符是字母、数字、标点符号、控件等。

标签: c format scanf


【解决方案1】:

您可以检查 scanf 为@Some programmer dude。您可以比较成功填充的计数参数(感谢@chux

在您的情况下,scanf 没有找到任何整数值,到达输入末尾并返回 EOF,保持 a 变量不变。

如果失败,它将返回 EOF(阅读 http://www.cplusplus.com/reference/cstdio/scanf/#return)。

if(scanf("%d", &a) == 1) //Check if exactly one parameter was read. 
    printf("entered number is %d\n", a);

对于字符,您最好使用getch() 或至少在scanf 上请求"%c"

if(scanf("%c", &a) == 1)
    printf("entered key was %d\n", a);

您收到的“垃圾”值是程序内存中的值,因为 a 未初始化。

【讨论】:

  • 嘿 chux,你是怎么链接到程序员老兄评论的?
  • 注意:if(scanf("%d", &amp;a) == 1) 具有更复杂格式的优势,例如scanf("xyz%d", &amp;a),它可能返回 0,1,EOF。
  • 右键单击评论的时间戳以获取链接。顺便说一句,看起来你已经被一个连续的投票者访问了。
  • 哦,谢谢@chux,我从来没有检查过参数计数。我会更新我的答案。
  • "返回 EOF,保持 a 变量不变。"可能在技术上是错误的。如果出现罕见的输入错误(例如 KB 线损坏),则返回 EOF 并且 a 的状态可能未知。我还没有找到这方面的 C 规范,但总的来说,当输入错误发生时,最好不要指望a 的状态。
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
相关资源
最近更新 更多