【问题标题】:Hidden or special characters in strings or different statement codes字符串或不同语句代码中的隐藏或特殊字符
【发布时间】:2014-08-23 01:41:00
【问题描述】:

如何使 fgets(或类似语句)的输入字符串 S1 等于我声明的静态字符串 S2?

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

main() {
    char s1[80];
    char s2[] = "This is a test.";
    int l1, l2;

    system("clear");
    printf("%s\n\n", s2);
    printf("Please type exactly the above sentence: ");
    fgets(s1,80,stdin);

    l1=strlen(s1);
    l2=strlen(s2);
    printf("\n String entered for S1, have a length of %d:\n %s", l1, s1);
    printf("\n String static  for S2, have a legnth of %d:\n %s", l2, s2);
    if(s1==s2)
        printf("\n\nOk! they're with the same length!\n");
    else
        printf("\n\nNop! They are NOT the same.\n");
    return(0);
}

【问题讨论】:

  • 您是要比较l1l2 而不是s1s2
  • 我需要帮助才能了解为什么 s1 和 s2 的字符串不一样,即使您正确输入了“这是一个测试”的确切句子。并寻求我如何能够做到这一点。谢谢你,以及每一个花时间(努力)来研究这个基本问题的人。 :-)

标签: c string fgets


【解决方案1】:

您正在进行指针比较,而不是字符串比较。要比较字符串的内容,请使用strcmp (docs)

if (strcmp(s1, s2) == 0)
...

【讨论】:

    【解决方案2】:

    fgets 读取一行输入(最长指定长度,在您的情况下为 80)。它将该行存储在其第一个参数 (s1) 指向的数组中——包括终止的 '\n' 换行符。

    这意味着在您调用fgets 之后,假设您准确输入"This is a test." 然后输入Enters1 将包含"This is a test.\n"不是 "This is a test.".

    您可以在比较之前删除该换行符 - 或者您可以将其替换为空字符 '\0',这标志着字符串的结尾:

    size_t len = strlen(s1);
    if (s1[len-1] == '\n') {
        s1[len-1] = '\0';
    }
    

    (如果您的编译器不支持混合声明和语句,您可能需要将 len 的声明移动到 main 的顶部 - 但 strlen 调用仍然必须在 之后完成 fgets.)

    要测试s1s2 是否包含相同的字符串值,请使用strcmp 函数;你的s1 == s2 做了一个指针 比较。如果字符串相等,strcmp 返回 0。 (如果不是,则返回负值或正值,以指示左侧字符串在字典顺序上是否小于或大于右侧字符串。)

    您的代码中的一些次要 cmets:

    main() 应该是 int main(void)。 (说来话长;现在,相信我的话。)

    可能不需要调用system("clear")。为什么要清屏?可能有关于它的有用信息。它不适用于所有系统。如果我想在运行你的程序之前清屏,我可以自己做,非常感谢。

    您的消息“它们的长度相同”不太正确。如果您使用strcmp 而不是== 来更正测试,那么您正在测试字符串是否具有相同的值,它们的长度是否恰好相同。

    通常当您打印一条消息时,最好将换行符\n 放在输出的end 处。通常最好在消息的末尾只有一个\n(除非你想用一个printf打印多行,或者用多个printfs建立一行,你可以这样做但它不是这里有必要。)

    您的问题最初有getsscanf 标签。永远不要使用gets 函数;它本质上是不安全的,并且已从语言中删除。 scanf 很棘手,在这种情况下不需要。

    【讨论】:

    • 关于尾随换行的好消息。我没有在我的 ideone 摆弄中发现它,因为我没有在我的输入中包含尾随换行符(所以 fgets 会因为 EOF 而返回)。
    • 我已经为 s1(输入的字符串)的字符从“\n”更改为“\0”添加了“size_t”条件代码。我还使用语句“strcmp”修改比较条件(s1==s2),而不是直接比较指针。它完成了这项工作。我也听从了 Thompson 先生给出的建议,感谢我们学习如何养成高效的编程习惯。结案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2016-11-30
    • 2015-11-04
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多