作为初学者,我一直在使用库string.h
的一些功能,并且在函数strcmp
方面存在一些问题。
我写了比较两个字符串的程序。如果它们相等,则返回YES
和NO
。
#include <stdio.h>
#include <string.h>
int main() {
char a[100];
char b[15] = "hello";
fgets(a, 100, stdin);
int compare;
compare = strcmp(a, b);
if(compare == 0) {
printf("YES");
}
else {
printf("NO");
}
return 0;
}
即使我从键盘上输入hello
,我也会运行它NO
。当我添加第printf("%d", compare)
行时,结果表明,对于任何输入,我得到1
,即a
中的停止字符大于b
中的停止字符。
我的错误在哪里?
答案 0 :(得分:4)
fgets(a, 100, stdin);
也会将您输入的换行符存储到缓冲区中。因此a
包含"hello\n"
。这个额外的角色抵消了比较。
您可以尝试通过某种方式删除换行符 1 ,或者与strncmp
进行比较。
例如:
char *newline = strchr(a, '\n');
if (newline)
*newline = '\0';
答案 1 :(得分:4)
这不是扫描错误,但问题是,fgets()
扫描并将尾随换行符存储到提供的缓冲区中。如果你要将缓冲区与不包含终止换行符的字符串文字进行比较,你需要摆脱它。
要剥离尾随换行符,您可以使用类似
的内容size_t len = strlen(a);
if (len > 0 && a[len-1] == '\n') {
a[--len] = '\0';
}
See this answer for more reference
如果没有删除换行符,strcmp()
将不会宣布比较为成功。
否则,您可以使用strncmp()
并提供字符串文字的大小,以使比较仅限于有效输入。
答案 2 :(得分:4)
fgets
会追加与Enter键对应的换行符。
在将字符串与另一个字符串进行比较之前,您应该删除该字符
a[strcspn( a, "\n" )] = '\0';
例如
#include <stdio.h>
#include <string.h>
int main() {
char a[100];
char b[15] = "hello";
fgets(a, 100, stdin);
a[strcspn( a, "\n" )] = '\0';
int compare;
compare = strcmp(a, b);
if(compare == 0) {
printf("YES");
}
else {
printf("NO");
}
return 0;
}