strcmp说看似相同的字符串不相等

时间:2019-02-08 20:55:23

标签: c strcmp

我正在使用strcmp比较两个字符串。 lhs来自文件流,通过fgets。由for循环生成的rhsn-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,指示字符串是相同的,但是我得到了其他一些非零值。

为什么这些字符串不相等?

2 个答案:

答案 0 :(得分:2)

输入到缓冲区中的字符串并不完全相同,并且您忽略添加空终止符意味着字符串程序将继续将字符串读入缓冲区,直到找到空终止符为止,运行以下代码显示我们这个:

size_t n = 5;
char lhs[n];
char rhs[n];
for(int i = 0; i < n-1; i++)
    rhs[i] = ' ';
for(int i = 0; rhs[i]; i++)
    printf("| %d ", rhs[i]);

输出:

  

| 32 | 32 | 32 | 32 |未知值...可能为0,但直到那时仍是数组的一部分

您应该将数组视为内存地址,尤其是在将其传递给函数时

您应该这样写:

for(int i = 0; i < n-1; i++)
    rhs[i] = ' ';
rhs[n-1] = '\x00'; // null terminator

答案 1 :(得分: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;
}

在这里重要的是不要从fgets分配,这是警告,如果您打开了-Wall