如何在不对增量进行硬编码的情况下比较 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,但将标记保存在不同的字符串中,以便您以后可以访问它们。
我有一个缓冲区,其中包含我打开并读取的 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,但将标记保存在不同的字符串中,以便您以后可以访问它们。