【问题标题】:Ignoring all input characters until 'a' is entered - using scanf in C在输入“a”之前忽略所有输入字符 - 在 C 中使用 scanf
【发布时间】:2021-10-04 00:35:29
【问题描述】:

我正在 C 上尝试基本代码 sn-p。我的目的是在用户输入“a”之前忽略所有字符,然后将下一个非空白字符复制到 x。

#include <stdio.h>

int main()
{
    char x ;
    printf ("Input character - ") ;
    scanf  (" a %c", &x) ;
    printf ("x=%c is the input", x) ;
    return 0 ;
}

我在控制台中输入如下:

a <enter>
s <enter>

我得到的输出为:x=s is the input。这是正确的。

但是当我在控制台中输入如下:

b <enter>

执行突然结束,我得到的输出为:x= is the input

我不明白这种行为。我期待程序忽略“b”和后续字符,直到用户输入“a”。我是不是对 scanf 语句的解释有误?

【问题讨论】:

  • 使用循环读取所有字符(例如getchar 或类似字符)来检查'a' 字符输入。还要记得检查EOF(并记住所有字符输入函数都会返回一个int,这对于EOF 的检查非常重要)。
  • Did I interpret the scanf statement wrongly? 你对scanf(" a") 的解释是“阻塞并读取,直到输入时遇到字符“a””?
  • 您的代码等待正好一个 a 字符。那里没有“直到”的概念。
  • Meenie Leis,尝试if (scanf("%*[^a]a %c", &amp;x) ==1) ... 1)扫描并忽略所有非a,2)扫描a,3)忽略空白4)扫描char。我个人认为getchar() 是你要走的路。
  • 查看scanf的返回值。它会告诉您成功转换的项目数。如果您输入b,它将返回 0 而不是 1。

标签: c scanf


【解决方案1】:

我是否错误地解释了 scanf 语句?

是的。假设scanf 通常会这样做:

  • 从输入中读取一个字符
  • 检查是否匹配格式字符串
  • 如果匹配,scanf 继续到字符串的下一部分
  • 如果不匹配,scanf 调用 ungetc 并退出
  • scanf 返回扫描的参数数量或EOF,以防出现错误或未扫描任何参数。

如果您输入scanf(" a %c", &amp;x);,然后输入b &lt;enter&gt;,则:

  • scanf 读取 b
  • b 不匹配 " "(空格)
    • " " 空格很神奇,它匹配零个或多个空格字符
    • 所以scanf 继续
    • b 不匹配 a
  • scanf 致电ungetc('b')
  • scanf 返回 EOF

在这种情况下,x 永远不会被分配,x 未初始化并包含一些垃圾值。很可能在输出 x=&gt;here&lt; is 中有一些无法打印的不可见字符。

【讨论】:

    【解决方案2】:

    通过使用scanf("a%c",&amp;x);,如果输入类似于 'ab' 、 'ac' 、 'aa' 并给出 'b' 、 'c' 和 'a' 作为o/p分别,并且不会接受任何类似的东西。 (也可以给 o/pfor 输入,如 'aaa' , 'abc' 分别为 'a' , 'b')

    对于您的任务,您可以尝试以下代码:-(完全测试)

    #include <stdio.h>
    
    int main()
    {
        char x ;
        do{
            scanf("%c",&x);
        }while(x != 'a');      //Read until x is not 'a'
        
        scanf("%c",&x);        //Read next character from standard input into x
        printf("%c",x);        //And then print x
        return 0 ;
    }
    

    【讨论】:

    • 感谢 Ankit,但是我不希望 x 接受空格,所以第二个 scanf 必须是 ----- scanf(" %c, &amp;x) ;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多