Fgets跳过输入并打印下一行?

时间:2014-03-24 02:38:48

标签: c fgets

我试图读取包含空格的字符串,因此scanf无法正常工作,因此我尝试使用fgets。当我运行它并且命中if语句时,屏幕上显示的内容是:

Please enter the course name.
You entered the course: 


Please enter the course ID.

=======================

if(coursetotal==0)/*start of 1 course*/
    {

        printf("Please enter the course name.\n");
        fgets(course[0].name,sizeof(course[0].name),stdin);
        printf("You entered the course name: %s\n",course[0].name);


        printf("\nPlease enter the four digit course ID.\n");
        int temp=0,temp1=0,count=0; /*Variables used to check if 4 digits*/
        scanf("%d",&temp);
        temp1=temp;
        while(temp1!=0)
        {
            temp1/=10;
            count++;
        }
        if(count==4)/*start of is 4 digits*/
        {
            course[0].id=temp;
            coursetotal+=1;
            printf("You entered the course ID: %d\n",course[0].id);
        }/*end of is 4 digits*/
        else
        {
            printf("The course ID you input was not 4 digits.\n");
            return;
        }

        printf("You have successfully added the course: %s. The ID is : %d, and you now have a total of %d course.\n",course[0].name,course[0].id,coursetotal);

    } /*end 1 course*/

1 个答案:

答案 0 :(得分:1)

首先,我必须解决我在这里看到的烦恼:

  

我试图读取包含空格的字符串,因此scanf无法正常工作

That's not true at all.有一个名为negated scanset的东西,您可以使用它来读取通常终止scanf()字符串输入的空格字符(例如空格)

那就是说。您应该只选择一个输入机制scanf()fgets()并专门使用它。当你混合时,事情会变得怪异而错过。您在此处完成此操作的事实告诉我您已经在其他地方完成了此操作,并且您可能在此之前使用scanf()留下了一个不洁净的"" stdin缓冲区。这将解决您的问题。


现在给你一个简单的例子,给定一个int(num)和一个char *(`string):

scanf("%d", &num);
fgets(string, sizeof(string), stdin);
printf("%d\n%s\n", num, string); 

您似乎跳过了为fgets输入任何内容的功能,因为它实际上只是从scanf()的数字条目中删除了换行符字符。您将在输出中看到类似的内容:

5
5
               // <-- and a couple
              //  <-- of blank lines

表示您选择了换行符。如果你要查看字符串的第一个(也是唯一的)字符的ASCII值,那就更加明显了:

printf("%d\n", string[0]);   // this would yield 10 the ASCII value of \n