繁体   English   中英

Dev-C ++输入被跳过

[英]Dev-C++ Input skipped

#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中工作但不在这里......

通过一些研究,我猜想问题来自于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 ++建议用作编译器)。 但是,我完全记得我没有遵循建议,结果发现fgets()的行为也依赖于编译器。

gets()的手册页包含:

BUGS

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

Scanf或其他输入解析函数只接受来自stdin的调用中指定的所需数量的字符并拒绝其他字符。因此,在下一次读取stdin期间,这些被拒绝的值与换行符一起进入变量,从而跳过输入很少调用。所以最好调用一个清除stdin的清除例程并阻止垃圾进入其他变量。

虽然您的代码非常容易受到影响,但仍有解决方案: -

#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();
    }

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

当你的程序获得 ,它会读取一个非常短的行,该行只包含该换行符。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM