首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >已跳过Dev-C++输入

已跳过Dev-C++输入
EN

Stack Overflow用户
提问于 2012-08-11 02:16:31
回答 3查看 7.5K关注 0票数 2
代码语言:javascript
复制
#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中工作,但在这里不行……

EN

回答 3

Stack Overflow用户

发布于 2012-08-11 02:42:10

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

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

要读取我使用的字符:

代码语言:javascript
复制
fgets(text,sizeof(text),stdin);
sscanf(text,"%c",&c); /* or: c = text[0]; */

为了读取我使用过的整数

代码语言:javascript
复制
fgets(text,sizeof(text),stdin);
sscanf(text,"%d",&i);

我在一门C课程中遇到了一个主要的问题,那就是gets() ( DevC++)是作为一个编译器被建议使用的。然而,我完全记得我没有听从建议,事实证明fgets()的行为也依赖于编译器。

gets()的手册页包含以下内容:

错误

永远不要使用get()。因为在事先不知道数据的情况下不可能知道get()将读取多少字符,而且get()将在缓冲区结束后继续存储字符,所以使用它是非常危险的。它已经被用来破坏计算机的安全。改用fgets()。

票数 3
EN

Stack Overflow用户

发布于 2012-08-11 03:57:36

Scanf或其他输入解析函数仅采用从标准输入的调用中指定的所需数量的字符,并拒绝others.As这些被拒绝的值,在下一次读取标准输入期间,这些被拒绝的值与换行符一起进入变量,从而跳过几次输入。更好的做法是调用清除标准输入的清除例程,并停止垃圾进入其他变量。

尽管你的代码很容易受到攻击,但它还是有解决方案的:

代码语言:javascript
复制
#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();
    }
票数 3
EN

Stack Overflow用户

发布于 2012-08-11 02:41:53

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

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

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

代码语言:javascript
复制
printf("\nEnter Integer : ");
scanf("%d",&i);
while (getchar() != '\n')
    ;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11907102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档