2

我想制作一个以 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();
 }
4

6 回答 6

1

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

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

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

于 2013-10-17T10:32:52.420 回答
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()

你可以在这里阅读更多关于它的信息

于 2013-10-17T11:52:44.640 回答
1

该问题的简单解决方案是在和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();
}
于 2015-02-25T12:56:30.747 回答
0

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

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

试试干杯,;)

于 2016-04-04T15:21:18.467 回答
0

两个小时前我也遇到了同样的问题,但是要轻松解决这种情况,您所要做的就是在“”getchar()"之后和“ scanf()”之前添加一个“ gets(),以便额外的\n”进入“ getchar()”并且你可以在下一个“ gets()”中随意输入。

于 2020-05-10T22:44:50.587 回答
-1

我也遇到了与上面提到的相同的问题。所以在此处提到的答案的帮助下并使用 hit and trial 方法,我发现当我们在使用任何变量输入后按 Enter 时scanf()\n存储在下一个gets()函数中。 . 并且下次它不需要从键盘输入任何输入.. 所以为了避免这种情况,只需getchar()scanf()nd gets()nd 之间使用还记得getchar()只需要 1 个字符.. 所以不要再给任何额外的输入,scanf()这将是存储并将用于gets()nd 问题将保持不变.. 希望这会有所帮助.. 谢谢你..

于 2016-09-16T13:33:18.967 回答