为什么get()函数在scanf(“%d”)之前跳过?

时间:2013-10-17 10:19:12

标签: c

我想创建一个程序,将Roll No和Full name作为输入并简单地显示它 我的代码是。此代码通过获取函数跳过n的扫描值。为什么会出现这种错误以及如何解决这个错误?

 #include<stdio.h>
 #include<conio.h>
 void main()
 {
 int r;
 char n[30];
 printf("enter your roll no");
 scanf("%d",&r);
 printf("enter your full name");
 gets(n);
 printf("roll no is %d ",r);
 printf("name is %s ",n);
 getch();
 }

而下面的代码扫描第一个获取值并跳过第二个。

#include<stdio.h>
#include<conio.h>
void main()
{
 int r;
 char n[30], f[30];
 printf("enter your roll no");
 scanf("%d",&r);
 printf("enter your full name");
 gets(n);
 printf("enter your full name of your father ");
 gets(f);
 printf("roll no is %d ",r);
 printf("name is %s ",n);
 printf("father name is %s ",f);
 getch();
 }

6 个答案:

答案 0 :(得分:2)

问题的简单解决方案是在fflush(stdin);scanf();之间添加gets();

#include<stdio.h>
#include<conio.h>
void main()
{
    int r;
    char n[30],fn[30];
    clrscr();
    printf("\nEnter roll ");
    scanf("%d",&r);
    fflush(stdin);
    printf("\nEnter name ");
    gets(n);
    printf("\nEnter father name ");
    gets(fn);

    printf("\n\nRoll %d",r);
    printf("\nname %s",n);
    printf("\nfather name %s",fn);
    getch();
}

答案 1 :(得分:1)

使用scanf代替gets将解决您的问题:

scanf("%s", n); // Read in your name

请注意,在读取此类字符串时,应使用传递字符串长度的安全函数(例如来自MSDN的scanf_s)。

答案 2 :(得分:1)

代码不会跳过扫描'n'的值。 我相信当你运行程序时,你输入Roll No然后按键盘上的 ENTER 键。 这是原因。 只要按 ENTER 键,转义序列'\ n'就会保存在数组 n 中。 gets()命令正在执行。


在第二种情况下,变量'n'存储转义序列,下一个变量'f'获取您接下来输入的字符串。


要使代码正常工作,只需输入您的scanf语句,如下所示: -

scanf("%d ",&r);

注意%d之后的空格

试试这段代码 -

#include<stdio.h>

int main(void)
{
    int r;
    char n[30], f[30];
    printf("Enter your roll no");
    scanf("%d ",&r);  // I have inserted a space after %d
    printf("Enter your full name");
    gets(n);
    printf("Enter your full name of your father ");
    gets(f);
    printf("\nRoll no is %d ",r);
    printf("\nName is %s ",n);
    printf("\nFather name is %s ",f);
    return 0;
}

提示: - 你必须尽量不要使用gets()和puts()

你可以read more about it here

答案 3 :(得分:0)

我不知道为什么会被跳过,但你可以做些什么来避免任何其他混淆,如fflush(stdin)或fgets等等。

在下一行使用gets(string)。因此,当它跳过第一个获取命令时,它会转到另一个命令。

试试吧 干杯, ;)

答案 4 :(得分:0)

两个小时前我遇到了同样的问题,但是要轻松解决这种情况,您要做的就是在“ getchar()"”之后和“ {{ 1}}”,这样多余的“ scanf()”将转到“ gets()”,您可以在下一个“ \n”中键入所需的内容。

答案 5 :(得分:-1)

我也遇到了上面提到的同样的问题..所以在这里提到的答案的帮助下,使用命中和试用方法,我发现当我们使用scanf()输入任何变量后按Enter键,\n存储在下一个gets()函数中..下次它不接受来自键盘的任何输入..所以为了避免这种情况,只需在{{之间使用getchar() 1}} nd scanf() nd还记得gets()只占用1个字符..所以不要再向getchar()提供任何额外的输入,因为这将被存储并将用于{ {1}}问题将保持不变...... 希望这会有所帮助.. 谢谢你..