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

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

4

3 回答 3

3

通过一些小的研究,我猜这个问题来自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++)被建议作为编译器时,我遇到了 gets() 的一个主要问题。但是,我完全记得我没有遵循建议,结果 fgets() 的行为也取决于编译器。

的手册页gets()有这个:

错误

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

于 2012-08-10T18:42:10.130 回答
3

Scanf 或其他输入解析函数仅采用来自 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();
    }
于 2012-08-10T19:57:35.610 回答
2

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

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

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

printf("\nEnter Integer : ");
scanf("%d",&i);
while (getchar() != '\n')
    ;
于 2012-08-10T18:41:53.013 回答