我有一个缓冲区,其中包含我打开并读取的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;
}
您的代码包含三个不同的部分。让我们对其进行分析:
strtok
部分您从文件中获取数据,然后在strtok
上进行迭代:
fgets(buff, 1024, fp);
char *csvData = strtok(buff, ",");
while(csvData != NULL){
csvData = strtok(NULL, ",");
}
您似乎对在不同位置找到的内容不感兴趣:实际上,csvData
总是被最后一个标记覆盖。最后等于NULL
。
唯一得到的是原始数组buff中的逗号被'\0'
覆盖。打印buff
时,您只会看到"1000"
,因为在此子字符串之后是strtok
放置的字符串终止符。
"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。
strstr
尝试最后,您使用strstr
函数查找字符串。这是一个聪明的主意。但是正如前面已经说过的那样,buff不包含它。好吧,缓冲区实际上确实包含它,但是字符串实用程序将在找到的第一个'\0'
处停止。
char *found;
found = strstr(buff, "CAP_NET_RAW");
printf("%s\n", found);
因此found
将为NULL,而取消引用NULL指针(这是%s
告诉printf要做的事情将导致分段错误。
作为查找所关心的唯一字符串的一种非常简单的方法,我建议仅使用strstr
,而无需使用strtok。另外,您仍然可以使用strtok,但是将令牌保存在不同的字符串中,以便以后可以访问它们。
您的代码包含三个不同的部分。让我们对其进行分析:
strtok
部分您从文件中获取数据,然后在strtok
上进行迭代:
fgets(buff, 1024, fp);
char *csvData = strtok(buff, ",");
while(csvData != NULL){
csvData = strtok(NULL, ",");
}
您似乎对在不同位置找到的内容不感兴趣:实际上,csvData
总是被最后一个标记覆盖。最后等于NULL
。
唯一得到的是原始数组buff中的逗号被'\0'
覆盖。打印buff
时,您只会看到"1000"
,因为在此子字符串之后是strtok
放置的字符串终止符。
"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。
strstr
尝试最后,您使用strstr
函数查找字符串。这是一个聪明的主意。但是正如前面已经说过的那样,buff不包含它。好吧,缓冲区实际上确实包含它,但是字符串实用程序将在找到的第一个'\0'
处停止。
char *found;
found = strstr(buff, "CAP_NET_RAW");
printf("%s\n", found);
因此found
将为NULL,而取消引用NULL指针(这是%s
告诉printf要做的事情将导致分段错误。
作为查找所关心的唯一字符串的一种非常简单的方法,我建议仅使用strstr
,而无需使用strtok。另外,您仍然可以使用strtok,但是将令牌保存在不同的字符串中,以便以后可以访问它们。