【问题标题】:Getchar() skips the first value scanned in while loopGetchar() 跳过 while 循环中扫描的第一个值
【发布时间】:2021-11-24 23:27:39
【问题描述】:

我正在尝试一次选择一个扫描的所有单个值(不能使用数组或字符串)。现在,它跳过了用户实现的第一个值,我不知道为什么。我希望当 getchar 到达“=”时停止循环,这将位于扫描值的末尾。

int main () {
char c;
while(scanf("%c", &c) != '=') {
 c=getchar();
 printf("print ");
 putchar(c);

 }
return 0;
}

在终端中,当我输入“a=”时,我只收到“=”而不是“a”。有人可以帮忙吗?

【问题讨论】:

  • 检查scanf返回的内容(不是输入字符)
  • 永远不要使用"%c"。始终使用" %c"。 (注意空格。)
  • scanf("%c", &c) 的上下文中,唯一可能的返回值是 1 和 EOF(0 不在可能性之中)。如果没有字符可读取,则返回 EOF;否则,它将返回 1。

标签: c while-loop char scanf getchar


【解决方案1】:

while 循环中的条件和getchar 的以下调用没有意义。

while(scanf("%c", &c) != '=') {
 c=getchar();
 //...

例如 *C 标准,7.21.6.4 scanf 函数)

3 scanf 函数返回宏 EOF 的值,如果输入 失败发生在第一次转换(如果有)完成之前。 否则,scanf 函数返回输入项的数量 在 早期匹配失败的事件。

并且不输出scanf调用读取的字符。

你应该写

char c;
while( scanf(" %c", &c) == 1 && c != '=') {
 printf("print %c", c);
}

注意这个scanf的调用

scanf( " %c", &c)

将跳过空白字符。如果要输出任何字符,则需要删除转换说明符之前的空白,例如

scanf( "%c", &c)
       ^^^^ 

如果你想使用getchar,那么循环看起来像

int c;
while( ( c = getchar() ) != EOF && c != '=') {
 printf("print %c", c);
}

在这种情况下,如您所见,变量c 必须声明为具有int 类型。

【讨论】:

    【解决方案2】:

    scanf() 函数返回成功转换和分配的字段数。

    您可以在此处阅读更多内容:https://www.ibm.com/docs/en/i/7.3?topic=functions-scanf-read-data

    在您的情况下,如果 c 被扫描并成功分配,它将返回 1,否则返回 0。

    上述文档是特定于平台的,但以下方法仍然适用于任何地方。

    如果您希望循环在字符为“=”时结束,那么您可以简单地与 if 条件进行比较并中断循环:

    int main () {
    char c;
    while(1) {
     c=getchar();
     if (c == '=') {
       break;
     }
     printf("print ");
     putchar(c);
    
     }
    return 0;
    }
    

    【讨论】:

    • 您引用的scanf 的文档是特定于平台的。并非所有信息都适用于 ISO C。因此,您可能希望参考与平台无关的文档。我推荐this one
    • @AndreasWenzel,你是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多