【问题标题】:How to prevent '\n' being passed as input?如何防止 '\n' 作为输入传递?
【发布时间】:2020-05-24 12:09:29
【问题描述】:

当我们执行以下代码时:

#include <stdio.h>

int main(void){
    char x,y;
    scanf("%c", &y);
    x = getchar();
    putchar(x);
    return 0;
}

scanf("%c", &amp;y); 语句中输入的回车将传递给 x。有什么办法可以摆脱这个吗?我现在如果我们使用scanf,那么我们可以通过scanf("%*c%c", &amp;x); 忽略\n,但不知道使用getchar() 时会做什么。

【问题讨论】:

  • 清空输入缓冲区
  • 请澄清你的意思是什么
  • 它的目标是读取用户输入的,从fgets()和一个大的缓冲区开始,然后解析char y的缓冲区。
  • 我不确定这是否是最好的方法,但它适用于您的情况:stackoverflow.com/questions/7898215/…。在打电话给getchar之前做。
  • 首先您需要记住(或了解)getchar 返回一个 int。这对于您真正需要的任何EOF 检查都很重要。解决问题的第二件事是在循环中逐个字符读取,直到您读取换行符(或命中文件结尾)。

标签: c pointers io user-input getchar


【解决方案1】:

你可以这样做

#include <stdio.h>

int main(void)
{
    char x,y,ch;

    scanf("%c%*c", &y);
    while((ch=getchar())!='\n'&&ch!=EOF); //removes all character in input buffer
    x = getchar();
    putchar(x);
    return 0;
}

【讨论】:

    【解决方案2】:

    基本上是输入缓冲区的问题,在您的情况下,您可以使用替代输入字符串 getchar() 和 fflush(stdin);处理这个问题。

    【讨论】:

    • 第二个scanf 不需要getchar 调用,您只需告诉scanf 通过在格式字符串中添加一个空格来跳过前导空格:@987654324 @
    • fflush(stdin) 是 UB。
    • @Amandeep C 规范明确规定将仅输入流(如stdin)传递给fflush 是UB。不幸的是,一种常见的编译器将其添加为该语言的不可移植扩展。应避免此类扩展(不惜一切代价 IMO)。
    猜你喜欢
    • 2021-01-03
    • 2013-12-13
    • 2021-10-15
    • 2013-09-13
    • 1970-01-01
    • 2020-09-23
    • 2019-12-18
    • 2018-10-05
    • 1970-01-01
    相关资源
    最近更新 更多