【问题标题】:scanf() curious behaviour!scanf() 奇怪的行为!
【发布时间】:2011-06-14 20:40:59
【问题描述】:

我最近偶然发现了一个奇怪的案例(至少对我来说,因为我以前没有遇到过)..考虑下面的简单代码:-

int x;
scanf("%d",&x);
printf("%d",x);

上面的代码接受一个普通的整数输入,并按预期显示结果..

现在,如果我将上面的代码修改为以下内容:-

int x;
scanf("%d ",&x);//notice the extra space after %d
printf("%d",x);

在给出 printf 语句的结果之前,这需要另一个额外的输入。我不明白为什么空格会导致 scanf() 的行为发生变化。任何人都可以向我解释一下...。

【问题讨论】:

  • scanf 是邪恶的,应该避免 - 所以说我和其他人:):stackoverflow.com/questions/456303/…
  • @Bukes: 是的,如果你不知道如何编程或阅读文档,你不应该使用 C
  • @Chris Dodd - scanf 无法区分换行符和其他空格。如果您想对输入进行精细控制,或者希望能够从错误中恢复正常,那么无论您对 C 的了解程度如何,都不能使用 scanf

标签: c++ c scanf


【解决方案1】:

来自http://beej.us/guide/bgc/output/html/multipage/scanf.html

scanf() 系列函数从控制台或 FILE 流中读取数据,对其进行解析,并将结果存储在您在参数列表中提供的变量中。

格式字符串与 printf() 中的格式字符串非常相似,因为您可以告诉它读取“%d”,例如 int。 但它还具有其他功能,最值得注意的是它可以吞噬您在格式字符串中指定的输入中的其他字符

正在发生的事情是 scanf 是模式匹配格式字符串(有点像正则表达式)。 scanf 一直使用来自标准输入(例如控制台)的文本,直到匹配整个模式。

在您的第二个示例中,scanf 读入一个数字并将其存储在 x 中。但它还没有到达格式字符串的末尾——还有一个空格字符。所以 scanf 从标准输入中读取额外的空白字符以便(尝试)匹配它。

【讨论】:

    【解决方案2】:

    来自man page:

    格式字符串由一系列指令组成,这些指令描述 如何处理输入字符的序列。如果处理一个 指令失败,没有进一步的输入被读取,并且 scanf() 返回。一种 “失败”可以是以下任何一种:输入失败,意思是 输入字符不可用或匹配失败,这意味着 输入不恰当(见下文)。

       A directive is one of the following:
    
       ?      A  sequence of white-space characters (space, tab, newline, etc;
          see isspace(3)).  This directive matches  any  amount  of  white
          space, including none, in the input.
    

    【讨论】:

    • 请注意,这意味着当格式中有空格时,scanf 会读取输入。消耗并丢弃空白字符,直到找到非空白字符。它将将该字符作为下一个要读取的字符,然后返回。
    【解决方案3】:

    man scanf

    [...] 一系列空白字符(空格、制表符、换行符等; 参见 isspace(3))。该指令匹配任意数量的白色 输入中的空格,包括无空格。

    【讨论】:

    • @Christian Rau:这是关于模式匹配的。一个空格matches any amount of white space, [...], in the input。似乎是一个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多