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



我有一个缓冲区,用于保存我打开并读取的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] != ''){
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("%sn", found);
fclose(fp);
return 0;
}

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


1.strtok

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

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

您似乎对在不同位置发现的内容不感兴趣:事实上,csvData总是被最后一个令牌覆盖。最后它等于CCD_ 6。

你得到的唯一一件事就是用''覆盖原始数组buff中的逗号。打印buff时,您将只看到"1000",因为在该子字符串之后是由strtok放置的字符串终止符。


2.搜索"CAP_NET_RAW"

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

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

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

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


3.strstr尝试

最后,使用strstr函数查找字符串。这是个聪明的主意。但正如前面所说,buff不包含它。缓冲区确实包含它,但字符串实用程序会在找到的第一个''处停止。

char *found;
found = strstr(buff, "CAP_NET_RAW");
printf("%sn", found);

所以found将为NULL,并且取消引用NULL指针(这是%s告诉printf要做的(将导致分段错误。


4.结论

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

最新更新