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

C 字符串或不同语句代码中的隐藏字符或特殊字符,c,string,fgets,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 a

如何使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);
}
#包括
#包括
main(){
chars1[80];
char s2[]=“这是一个测试。”;
int l1,l2;
系统(“清除”);
printf(“%s\n\n”,s2);
printf(“请准确键入上述句子:”);
fgets(s1,80,标准DIN);
l1=strlen(s1);
l2=strlen(s2);
printf(“\n为S1输入的字符串,长度为%d:\n%s”,l1,S1);
printf(“\n S2的静态字符串,长度为%d:\n%s”,l2,S2);
如果(s1==s2)
printf(“\n\nOk!它们的长度相同!\n”);
其他的
printf(“\n\n不!它们不一样。\n”);
返回(0);
}

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


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

这意味着在您的
fgets
调用之后,假设您准确地键入了
“这是一个测试。”
,然后键入Enter,
s1
将包含
“这是一个测试”。\n“
,而不仅仅是
“这是一个测试。”

您可以在比较之前删除该换行符,或者更确切地说,您可以将其替换为空字符
'\0'
,它标记字符串的结尾:

size_t len = strlen(s1);
if (s1[len-1] == '\n') {
    s1[len-1] = '\0';
}
(如果编译器不支持混合声明和语句,则可能需要将
len
的声明移动到
main
的顶部,但是
strlen
调用仍然必须在
fgets
之后进行)

要测试
s1
s2
是否包含相同的字符串值,请使用
strcmp
函数;您的
s1==s2
执行指针比较<如果字符串相等,则code>strcmp返回0。(如果不是,它将返回一个负值或正值,以指示左字符串在字典上是否小于或大于右字符串。)

对代码的一些小注释:

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

可能不需要调用
系统(“清除”)
。为什么要清除屏幕?可能有关于它的有用信息。而且它不会在所有系统上都起作用。如果我想在运行您的程序之前清除屏幕,我可以自己做,非常感谢

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

通常在打印消息时,最好将换行符
\n
放在输出的末尾。通常情况下,最好在消息的末尾只添加一个
\n
(除非您想用一个
printf
打印多行,或者用多个
printf
构建一行,您可以这样做,但在这里不需要)


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

你的意思是比较
l1
l2
,而不是
s1
s2
?我需要帮助,看看为什么s1和s2不是相同的字符串,即使你正确键入了“这是一个测试”这句话。并寻求我如何能做到这一点。谢谢你们,以及每一位花时间(努力)研究这个基本问题的人。:-)关于尾随新线的好消息。我没有在我的ideone fiddling中捕捉到它,因为我没有在输入中包含尾随的换行符(因此fgets会因为EOF而返回)。我已经为s1(输入的字符串)的字符从“\n”更改为“\0”添加了“size\t”条件代码。我还使用语句“strcmp”修改比较条件(s1==s2),而不是直接比较指针。它成功了。我也遵循了汤普森先生的建议,我很欣赏他对我们养成高效编程习惯的学习。结案!
size_t len = strlen(s1);
if (s1[len-1] == '\n') {
    s1[len-1] = '\0';
}