【问题标题】:Dev-C++ Input skipped跳过 Dev-C++ 输入
【发布时间】:2012-08-08 01:50:28
【问题描述】:
#include<stdio.h>
#include<conio.h>
main()
{
      int i;
      char c, text[30];
      float f;
      printf("\nEnter Integer : ");
      scanf("%d",&i);
      printf("\nEnter Character : ");
      c = getch();
      printf("\nEnter String:");
      gets(text);
      printf("\nEnter Float:");
      scanf("%f",&f);
      printf("\nInteger : %d",i);
      printf("\nCharacter : %c8",c);
      printf("\nString : %s",text);
      printf("\nFloat : %f",f);
      getch();
}

为什么这个简单的程序无法使用gets() 函数读取string?我还应该用什么来纠正它?好吧,它在我的旧 32 位 PC 上的 Turbo C 中工作,但在这里不行......

【问题讨论】:

  • DevC++ 是 crap 你可以在这十年的编译器上试试。
  • 好吧,伙计,但那个垃圾是我大学的标准编译器,我不知道他们为什么使用这种垃圾。真的很郁闷
  • 请作为第一个练习制定一个适当的问题标题。这个真的没有什么信息,不会帮助你之后的其他人。
  • 好吧,我想知道它是否是 DEVC++。我一直想知道有一段时间了。这是免费的。我的朋友买了 Intel C++ 编译器,这很不可思议,但也是 800.00 美元。我想找出一个很好的免费 C++ 编译器,人们可以下载甚至购买。

标签: c gets


【解决方案1】:

Scanf 或其他输入解析函数仅采用标准输入调用中指定的所需字符数量并拒绝其他字符。因此,这些拒绝的值在下次读取标准输入时与换行符一起输入变量并因此跳过几个调用的输入。因此最好调用一个清除标准输入并阻止垃圾进入其他变量的清晰例程。

虽然你的代码很容易受到攻击,但它仍然有解决方案:-

#include<stdio.h>

  int clear()
  {
    while ((getchar())^'\n');    
  }
  int  main()
    {
          int i;
          char c, text[30]={0};
          float f;
          printf("\nEnter Integer : ");
          scanf(" %d",&i);
          printf("\nEnter Character : ");     
          scanf(" %c",&c);    
          printf("\nEnter String:");
      clear();
          gets(text);
          printf("\nEnter Float:");   
          scanf(" %f",&f);    
          printf("\nInteger : %d",i);
          printf("\nCharacter : %c",c);
          printf("\nString : %s",text);
          printf("\nFloat : %f",f);
          getchar();
    }

【讨论】:

    【解决方案2】:

    通过一些小的研究,我猜想问题出在scanf()scanf() 读取的行没有行尾字符 '\n',它似乎留在缓冲区中,并且在下一条语句时实际上是红色的。

    您也可以使用fgets() 和sscanf(),如下所示:

    读取我使用的字符:

    fgets(text,sizeof(text),stdin);
    sscanf(text,"%c",&c); /* or: c = text[0]; */
    

    读取我用过的整数

    fgets(text,sizeof(text),stdin);
    sscanf(text,"%d",&i);
    

    在我的 C 课程(DevC++)被建议作为编译器时,我遇到了 get() 的一个主要问题。但是,我完全记得我没有遵循建议,结果 fgets() 的行为也取决于编译器。

    gets() 的手册页是这样的:

    错误

    永远不要使用gets()。因为在事先不知道数据的情况下不可能知道gets()会读取多少个字符,并且因为gets()会继续存储超过缓冲区末尾的字符,所以使用起来非常危险。它已被用来破坏计算机安全。请改用 fgets()。

    【讨论】:

    • 我还尝试了以下 fgets(text,sizeof(text),stdin) 而不是 gets(text)
    • 嗯!出于某种原因,我觉得(不知道)问题出在 getch() 而不是 fgets() 或 gets() 的行为上。我会使用 fgets() 读取缓冲区行并读取其中的第一个字符。我可以在之后使用相同的缓冲区来读取字符串
    • 我为程序 ' printf("\nEnter Character : "); fgets(c,sizeof(c),stdin); printf("\n输入字符串:"); fgets(text,sizeof(text),stdin);'
    • 好的!我一直在玩这个......仍然没有工作......现在,我正在删除 scanf() 并使用 fgets() 和 sscanf() 我认为它最终会工作......
    • @MuhammadFarag:- fflush 应该与标准输出一起使用。 stackoverflow.com/questions/2187474/…
    【解决方案3】:

    当您输入 42(或其他)作为第一个整数时,您实际上输入了三个字符:42,然后是换行符来自按 ENTER 的字符。您的第一个 scanf 读取一个整数,这意味着它只读取 42,将换行符留在输入缓冲区中。

    当您的程序到达 gets 时,它会读取一个非常短的行,该行仅包含该换行符。

    您可以通过在 scanf 之后读取并丢弃换行符来修复它,如下所示:

    printf("\nEnter Integer : ");
    scanf("%d",&i);
    while (getchar() != '\n')
        ;
    

    【讨论】:

    • 好的,推荐另一种方法。
    • @Ravithej:只需阅读并丢弃换行符即可。我会用一个例子来更新帖子。
    猜你喜欢
    • 2013-04-23
    • 2021-11-29
    • 2016-04-26
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多