使用fgets在C中获得一行

使用fgets在C中获得一行,c,string,fgets,C,String,Fgets,我有这个函数,但我的fgets函数不能正常工作,有人能帮我吗? 在案例3中,我要求用户输入他想要搜索酒店的内容,比如一个部分单词、两个单词等。当我运行它时,它不能正常工作,我不明白为什么 scanf("%d", &option); case 3: printf("\nEnter the name of the hotel you want to search for.\n\n>>>");

我有这个函数,但我的fgets函数不能正常工作,有人能帮我吗? 在案例3中,我要求用户输入他想要搜索酒店的内容,比如一个部分单词、两个单词等。当我运行它时,它不能正常工作,我不明白为什么

        scanf("%d", &option);


        case 3:
            printf("\nEnter the name of the hotel you want to search for.\n\n>>>");
            fgets(asked_hotel, sizeof(asked_hotel)-1, stdin);

            printf("The hotels matching what you searched are:\n\n");
            find_hotel(hotel_name,hotel_rating,address_name,city_name,address_code,NUM_HOTELS,asked_hotel);

这里的问题是使用
scanf
获取选项。它提取数字,但将换行保留在缓冲区中。这意味着当您下次调用fgets时,它将读取该换行符,您将得到一个空行

最简单的解决方案是要求scanf跳过尾随空格,包括换行符。这是通过在格式代码后添加空格来完成的:

scanf("%d ", &option);
/*       ^         */
/*       |         */
/* Note space here */

这里的问题是使用
scanf
获取选项。它提取数字,但将换行保留在缓冲区中。这意味着当您下次调用fgets时,它将读取该换行符,您将得到一个空行

最简单的解决方案是要求scanf跳过尾随空格,包括换行符。这是通过在格式代码后添加空格来完成的:

scanf("%d ", &option);
/*       ^         */
/*       |         */
/* Note space here */

建议将所有
scanf()
调用更改为
fgets()
/
sscanf()
对。例如:

scanf("%d", &option);


建议将所有
scanf()
调用更改为
fgets()
/
sscanf()
对。例如:

scanf("%d", &option);



你得到了什么结果,你期望得到什么?另外,
fgets
函数很可能没有问题,但是你的
find_hotel
函数有问题。@JoachimPileborg当我选择case 3(pres 3)时,它会提示我输入我搜索的单词,但它会去打印,所有的酒店都是自己的。那么现在真的是了解它的好时机了。谷歌“gdb教程”获得了数百万关于这方面的文档。热门歌曲,@PHIfounder,嗯,不知道你得到了什么结果,你期望得到什么?而且,
fgets
函数很可能没有问题,但是你的
find_hotel
函数有问题。@JoachimPileborg当我选择case 3(pres 3)时,它会提示我输入我搜索的单词,但它会去打印,所有的酒店都是自己的。那么现在真的是了解它的好时机了。谷歌“gdb教程”获得了数百万关于这方面的文档。热门,@PHIfounder,嗯,不知道我这么做了,效果更好,但不太好。现在,当我按下3键并按enter键时,它会把我带到新线,并在那里生活,如果我输入我想搜索的酒店名称,它会找到它,但是,在我想提示我的用户之前,它会提示我。@user251286在
find_hotel
中,您使用
scanf
%s
作为格式代码,但作为参数,您只有一个字符,这会导致未定义的行为。当然,您在我的回答中描述的训练whitepsace中也有同样的问题。@user251286尝试使用
getchar()
在fgets之后应该可以使用:)@JoachimPileborg我在做什么你在说什么在
%d
%s
之后添加一个空格。但它工作不正常。@User251286首先修复冗余代码(以简化下一步),然后使用调试器逐行检查代码。我相信到时候你会很容易发现这个问题的。不,别让我这么做。所以不是调试器,您必须自己做一些工作。将此视为一种有用的学习体验,并尝试使用调试器,它是任何程序员都能拥有的最有用的工具。我这样做了,它工作得更好,但不够好。现在,当我按下3键并按enter键时,它会将我带到新行,并在那里生活,如果我输入要搜索的酒店名称,它会找到它,但是,在我想提示我的用户之前,它会提示我。@user251286在
find_hotel
中,您使用
scanf
%s
作为格式代码,但作为参数,您只有一个字符,这会导致未定义的行为。当然,您在我的回答中描述的训练whitepsace中也有同样的问题。@user251286尝试使用
getchar()
在fgets之后应该可以使用:)@JoachimPileborg我在做什么你在说什么在
%d
%s
之后添加一个空格。但它工作不正常。@User251286首先修复冗余代码(以简化下一步),然后使用调试器逐行检查代码。我相信到时候你会很容易发现这个问题的。不,别让我这么做。所以不是调试器,您必须自己做一些工作。将此视为一次有用的学习体验,并尝试使用调试器,它是任何程序员都能拥有的最有用的工具。