【问题标题】:getchar following scanf (to read an integer) takes terminating "enter" key of scanf as character跟随scanf的getchar(读取整数)将scanf的终止“输入”键作为字符
【发布时间】:2018-08-23 01:36:16
【问题描述】:

当我有一个scanf 后跟一个getchar 时,为什么getchar 总是不断获取scanf 的最后一个分隔符?我怎么能阻止它?我尝试查看 scanf 的“格式说明符”,阅读了很多内容,但没有一个能解决这个问题。

代码如下图——

#include <stdio.h>
#include <conio.h>

int main()
{
    int a;
    char b;

    printf ("Enter an integer \n");
    scanf_s(" %d", &a);

    printf("Enter a character \n");
    b = getchar();

    printf("The integer you entered is %d \n", a);
    printf("The character you entered is %c \n", b);

    _getch();
    return 0;
}

输出如下 - 输入一个整数 4563 输入一个字符 您输入的整数是 4563 您输入的字符是

getchar 返回我在整数输入末尾按下的回车键。打印“输入字符”后屏幕甚至不会停止。这样做的正确方法是什么?

【问题讨论】:

  • #1 不要混合scanf和其他输入函数
  • 分隔符(通常是换行符)不是通过调用scanf() 输入的,而是留在标准输入中。消除分隔符的最简单/典型的方法是在调用scanf() 之后使用类似:int ch; while( (ch = getchar() ) != EOF &amp;&amp; ch != 'delimiter' ) ; 通常分隔符是换行符,因此“分隔符”将是“\n”`
  • @user3629249:添加虚拟 getchar 只是为了避免分隔符 - 这不是补丁吗?没有副作用吗?

标签: c scanf


【解决方案1】:

使用scanf(" %c", &amp;b) 代替getchar()

当您在 %c 之前放置空间时,您会清理缓冲区

或者你也可以使用这个来清理缓冲区:

int ch;
while ((ch = getchar()) != '\n' && ch != EOF);

完整示例:

int main(void)
{
    printf("Enter an integer \n");
    int a;
    scanf(" %d", &a);
    int ch;
    while ((ch = getchar()) != '\n' && ch != EOF) {
    }

    printf("Enter a character \n");
    char b = getchar();

    printf("The integer you entered is %d \n", a);
    printf("The character you entered is %c \n", b);

    _getch();
}

但我认为scanf()

【讨论】:

  • 空间会占用一个“空白”,所以如果分隔符是“空白”,那会很好用。如果分隔符是别的东西,这将不起作用
  • 哼,能举个例子吗?
  • scanf 在格式说明符之前有一个空格正在做我想做的事情。虽然 tt 不处理我的角色是空格或输入或制表符的情况,即任何空格。
  • 顺便说一句,你没有说完你的最后一句话,getchar() 返回一个int
  • @BhawandeepSingh 考虑 getchar(); 通常可以返回 256 个不同的 unsigned char 值或负的 EOF。通过将这 257 个可能不同的值保存在 8 位 char 中,一些信息会丢失。对于EOF == -1,代码如何回忆getchar() 返回值是255 或-1?更糟糕的是,当char 是一个unsigned char 时,char b;while (b != EOF) 永远不会是真的。此外,is...() 函数针对getchar() 的返回值定义得很好,而不是char 的所有负值——即UB。
猜你喜欢
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多