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

问题描述 投票:0回答:1

我有一个缓冲区,其中包含我打开并读取的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] != '\0'){
         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;
}
c string-comparison strtok strcmp strstr
1个回答
0
投票

您的代码包含三个不同的部分。让我们对其进行分析:


1。 strtok部分

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

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

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

唯一得到的是原始数组buff中的逗号被'\0'覆盖。打印buff时,您只会看到"1000",因为在此子字符串之后是strtok放置的字符串终止符。


2。搜索"CAP_NET_RAW"

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

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

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

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


3。 strstr尝试

最后,您使用strstr函数查找字符串。这是一个聪明的主意。但是正如前面已经说过的那样,buff不包含它。好吧,缓冲区实际上确实包含它,但是字符串实用程序将在找到的第一个'\0'处停止。

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

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


4。结论

作为查找所关心的唯一字符串的一种非常简单的方法,我建议仅使用strstr,而无需使用strtok。另外,您仍然可以使用strtok,但是将令牌保存在不同的字符串中,以便以后可以访问它们。


0
投票

您的代码包含三个不同的部分。让我们对其进行分析:


1。 strtok部分

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

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

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

唯一得到的是原始数组buff中的逗号被'\0'覆盖。打印buff时,您只会看到"1000",因为在此子字符串之后是strtok放置的字符串终止符。


2。搜索"CAP_NET_RAW"

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

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

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

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


3。 strstr尝试

最后,您使用strstr函数查找字符串。这是一个聪明的主意。但是正如前面已经说过的那样,buff不包含它。好吧,缓冲区实际上确实包含它,但是字符串实用程序将在找到的第一个'\0'处停止。

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

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


4。结论

作为查找所关心的唯一字符串的一种非常简单的方法,我建议仅使用strstr,而无需使用strtok。另外,您仍然可以使用strtok,但是将令牌保存在不同的字符串中,以便以后可以访问它们。

© www.soinside.com 2019 - 2024. All rights reserved.