如何使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);
}
答案 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
之后完成。)
要测试s1
和s2
是否包含相同的字符串值,请使用strcmp
函数;您的s1 == s2
执行指针比较。如果字符串相等,则strcmp
返回0。 (如果它们不是,则返回负值或正值,以指示左字符串是否按字典顺序小于或大于右字符串。)
对您的代码的一些小评论:
main()
应为int main(void)
。 (长篇故事;现在,请接受我的话。)
可能没有必要调用system("clear")
。你为什么要清除屏幕?可能有相关信息。它不适用于所有系统。如果我想在运行你的程序之前清除我的屏幕,我可以自己做,非常感谢你。
您的消息“他们的长度相同”并不完全正确。如果您使用strcmp
而不是==
来更正测试,那么您将测试字符串是否具有相同的值,无论它们的长度是否相同。
通常在您打印消息时,最好将换行符\n
放在输出的 end 处。通常最好在邮件末尾只有一个\n
(除非您要打印多行printf
,或者用多个printf
构建一行,你可以做,但这里没有必要。)
您的问题原来有gets
和scanf
个标签。切勿使用gets
功能;它本质上是不安全的,已从语言中删除。 scanf
很棘手,在这种情况下不需要。