代码之家  ›  专栏  ›  技术社区  ›  karafar

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

  •  0
  • karafar  · 技术社区  · 7 年前

    我正在使用 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 指示字符串是相同的,但是我得到了一些其他非零值。

    为什么这些字符串不被认为是相等的?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Shipof123    7 年前

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

    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]);
    

    输出:

    你应该这样写:

    for(int i = 0; i < n-1; i++)
        rhs[i] = ' ';
    rhs[n-1] = '\x00'; // null terminator
    
        2
  •  1
  •   tadman    7 年前

    清理此代码以创建

    #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 打开了。