【问题标题】:Using fgets to get a line in C使用 fgets 在 C 中获取一行
【发布时间】:2013-07-10 10:46:12
【问题描述】:

我有这个功能,但是我的 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);

【问题讨论】:

  • 你得到什么结果,你期望什么?
  • 另外,fgets 函数很可能不是问题,而是find_hotel 函数有问题。
  • @JoachimPileborg 当我选择案例 3(pres 3)时,它应该提示我输入我搜索的单词,但它会自行打印所有酒店。
  • 那么现在是了解它的好时机。谷歌“gdb 教程”可以获得数百万个关于此的文档。热门歌曲,cs.cmu.edu/~gilpin/tutorial
  • @PHIfounder,呵呵,不知道

标签: c string fgets


【解决方案1】:

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

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

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

【讨论】:

  • 我这样做了,效果更好,但还不够好,现在,当我按下 3 并按 Enter 键时,如果我输入我要搜索的酒店找到它,但是,它在我想提示我的用户之前提示我。
  • @user2512806 在find_hotel 中,您使用scanf%s 作为格式代码,但作为参数,您只有一个字符,这会导致未定义的行为。当然,您在我的回答中描述的培训 whitepsace 也有同样的问题。
  • @user2512806 在 fgets 之后尝试使用 getchar(); 应该可以工作:)
  • @JoachimPileborg 我正在做你说的在%d%s 之后添加一个空格。但它不能正常工作。
  • @user2512806 首先修复冗余代码(以简化下一步),然后使用调试器并逐行执行代码。我相信你会很容易找到问题的。不,不要让我这样做。 SO不是调试器,你必须自己做一些工作。将此视为一种有用的学习体验,并尝试使用调试器,它是任何程序员都可以拥有的最有用的工具。
【解决方案2】:

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

scanf("%d", &option);

char buf[80];
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d", &option);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多