【问题标题】:using fgets and strcmp in C [duplicate]在 C 中使用 fgets 和 strcmp [重复]
【发布时间】:2013-08-11 04:23:53
【问题描述】:

我试图从用户那里获取一个字符串输入,然后根据他们输入的输入运行不同的函数。

例如,假设我问:“你最喜欢的水果是什么?”我希望程序根据他们输入的内容发表评论……我不知道该怎么做。到目前为止,这是我所拥有的:

#include <stdio.h>
#include <string.h>

char fruit[100];

main() {
    printf("What is your favorite fruit?\n");
    fgets (fruit, 100, stdin);
    if (strcmp(fruit, "apple")) {
        printf("Watch out for worms!\n");
    }
    else {
        printf("You should have an apple instead.\n");
        }

}

当我运行程序时,无论我输入什么,它都不会执行 else 语句。

感谢您的帮助!

【问题讨论】:

  • strcmp 返回0(将评估为假)以指示两个字符串相等。
  • 阅读您尝试使用的函数的文档是否真的有害?
  • 另外,不要使用main(),而是使用int main(void)

标签: c fgets strcmp


【解决方案1】:

请注意代码中的两点:

  1. fgets 保留尾随的 '\n'。在与字符串“apple”进行比较之前,应将fruit 中的关联字符替换为“\0”。
  2. strcmp在两个字符串相同时返回0,所以if子句应该根据你的意思改变。(if子句中的fruit和“apple”是等价的)
  3. C 主函数的标准用法是int main(){ return 0;}

修改后的代码:

#include <stdio.h>
#include <string.h>

char fruit[100];

int main() {
    printf("What is your favorite fruit?\n");
    fgets (fruit, 100, stdin);
    fruit[strlen(fruit)-1] = '\0';
    if (strcmp(fruit, "apple") == 0) {
        printf("Watch out for worms!\n");
    }
    else {
        printf("You should have an apple instead.\n");
    }
    return 0;
}

【讨论】:

  • 以上是正确的,因为fgets将'\n'作为字符串的结尾,所以用'\0'替换它是正确的。
【解决方案2】:

if 条件更改为以下内容:

if(strcmp(fruit,"apple") == 0)

strcmp 如果匹配则返回 0 个字符串。您应该始终使用== 运算符比较结果

【讨论】:

    【解决方案3】:

    strcmp 如果输入匹配,则返回 0,如果左侧“大于”右侧,则某个值>0,如果左侧“小于”右侧,则某个值strcmp(...)==0 测试是否相等。但也有 clever 版本:!strcmp(...)。即使你不使用这种风格,学习识别它也是有用的。

    请记住,fgets 不会从字符串中删除换行符 '\n'

    【讨论】:

    • 如果字符串长度为arraysize-1,则删除。
    • 即便如此我也不会说换行符已删除,但可能保留待定。跨度>
    • 我应该在 removes 周围使用引号,这显然不是正确的词.....实际上,如果字符串足够小,它会保留'\n'被容纳,否则它不会。
    • 注意你对strcmp()返回值的描述是错误的;相等时的值将为 0(您也说过),但是当第一个参数比第二个参数“小”时,返回值将只是负数,不一定是 -1;同样,对于'greater',返回值将是正数,不一定是+1。见strcmp() behaviour in 32-bit and 64-bit systems
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多