如何在不对增量进行硬编码的情况下比较 C 中的字符串?

How to compare strings in C without hard coding the increments?

我有一个缓冲区,其中包含我打开并读取的 CSV 文件中的字符串。我使用 strtok() 拆分字符串并拆分“,”。所以现在我的字符串看起来像这样:

char buff[BUFFER_SIZE] = "1000" "CAP_SETPCAP" "CAP_NET_RAW"

我现在想对字符串的每个部分进行比较,但我无法让它发挥作用。我希望能够在不对任何内容进行硬编码的情况下做到这一点,这意味着我不想假设我需要移动多少空间。例如,从 CAP_SETPCAP 开始,我不想必须放置 buff+5。有人知道更好的处理方法吗?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define BUFFER_SIZE 1024

int main(int argc, char *argv[]) {

       FILE *fp = fopen("csvtest.csv", "r");
       char buff[BUFFER_SIZE];


       fgets(buff, 1024, fp);
       char *csvData = strtok(buff, ",");
       while(csvData != NULL){
             csvData = strtok(NULL, ",");
       }

      int i;
      while(buff[i] != '[=11=]'){
         strcmp(buff, "CAP_NET_RAW")
         printf("Match found");
         i++;
      }

      //or I wanted to do string comparison, but I kept getting
      //segmentation fault (core dumped)

      char *found;
      found = strstr(buff, "CAP_NET_RAW");
      printf("%s\n", found);

      fclose(fp);

      return 0;
}

您的代码包含三个不同的部分。让我们分析一下:


1。 strtok 部分

您从文件中获取数据,然后迭代 strtok:

fgets(buff, 1024, fp);
char *csvData = strtok(buff, ",");
while(csvData != NULL){
    csvData = strtok(NULL, ",");
}

您似乎对在不同位置发现的内容不感兴趣:实际上 csvData 总是被最后一个标记覆盖。最后等于 NULL.

你唯一得到的是用 '[=17=]' 覆盖原始数组 buff 中的逗号。打印 buff 你只会看到 "1000",因为在这个子字符串之后有 strtok.

放置的字符串终止符

2。正在搜索 "CAP_NET_RAW"

您现在迭代 buff[i] 直到字符串终止符。但是字符串终止符在第一个子字符串之后 "1000"!

int i;
while(buff[i] != '[=11=]'){
    strcmp(buff, "CAP_NET_RAW")
    printf("Match found");
    i++;
}

此外,您搜索 CAP_NET_RAW,但即使没有内部终止符问题,比较也永远不会成功。那是因为 (1) buff 中实际存在的字符串是 "CAP_NET_RAW" (带双引号); (2) 该标记是该行的最后一个,它将有尾随 '\n'fgets 不会删除它)。

顺便说一句:我在您编辑后复制了代码,现在没有检查 strcmp() return 值。我想这是一个错字。 注意: strcmp returns 0 如果字符串匹配。


3。 strstr 尝试

最后您使用 strstr 函数查找字符串。这是个聪明的主意。但正如之前所说,buff 不包含它。好吧,缓冲区实际上确实包含它,但是字符串实用程序将在他们找到的第一个 '[=17=]' 处停止。

  char *found;
  found = strstr(buff, "CAP_NET_RAW");
  printf("%s\n", found);

因此 found 将为 NULL,取消引用 NULL 指针(这就是 %s 告诉 printf 要做的事情)将导致分段错误。


4。结论

作为查找您唯一关心的字符串的一种非常简单的方法,我建议只使用 strstr,而不要之前使用 strtok。或者,您仍然可以使用 strtok,但将标记保存在不同的字符串中,以便您以后可以访问它们。