【发布时间】:2019-02-08 20:55:23
【问题描述】:
我正在使用strcmp 来比较两个字符串。 lhs 来自通过fgets 的文件流。 rhs 是由 for 循环生成的 n-1 空格序列。
示例
#include <string.h>
#include <stdio.h>
int main() {
size_t n = 10;
char rhs[n];
memset(rhs, ' ', n - 1); // Fill with spaces using memset()
rhs[n-1] = 0; // Add NUL terminator
printf("len=%zu\n", strlen(rhs));
char lhs[n];
FILE* file = fopen("test", "r");
fgets(lhs, sizeof(lhs), file);
printf("read=%s\n", lhs);
return 0;
}
使用 gdb 时,我会发现我有两个看起来相同的字符串(为此我使用了 gdb 的
print):
lhs = " "
rhs = " "
然而,strcmp(lhs, rhs) != 0。这应该返回一个0,表明字符串是相同的,但是我得到了一些其他的非零值。
为什么这些字符串不相等?
【问题讨论】:
-
打印出
char中的每个lhs和rhs最多n-1字符,看看它们之间哪个不同。顺便说一句,您说lhs被fgets读取,但您的伪代码显示rhs被读取。您应该展示您的真实代码,而不是伪代码。 -
rhs的大小为n-1,但您尝试将n字节读入其中。不会很顺利。 -
null终结符在哪里? -
fgets()也会留下尾随的换行符,如果它读取的行上有一个。您如何查看您的字符串内容? -
请注意,
fgets保留了在比较之前必须删除的换行符。