字符串中的隐藏或特殊字符或不同的语句代码

时间:2014-08-23 01:41:01

标签: c string fgets

如何使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);
}

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

这意味着在fgets来电后,假设您输入了"This is a test.",然后输入 Enter s1将包含"This is a test.\n",< em> not 只是"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。 (如果它们不是,则返回负值或正值,以指示左字符串是否按字典顺序小于或大于右字符串。)

对您的代码的一些小评论:

main()应为int main(void)。 (长篇故事;现在,请接受我的话。)

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

您的消息“他们的长度相同”并不完全正确。如果您使用strcmp而不是==来更正测试,那么您将测试字符串是否具有相同的值,无论它们的长度是否相同。

通常在您打印消息时,最好将换行符\n放在输出的 end 处。通常最好在邮件末尾只有一个\n(除非您要打印多行printf,或者用多个printf构建一行,你可以做,但这里没有必要。)

您的问题原来有getsscanf个标签。切勿使用gets功能;它本质上是不安全的,已从语言中删除。 scanf很棘手,在这种情况下不需要。