对于相同的两个相同字符串,Strcmp 不会 return 为零
Strcmp wont return zero for same two same strings
我正在使用具有两个字段的 fscanf 读取 CSV 文件。
datatype_t*read(FILE* fp)
{
char name[66];
char data[1466];
if (fscanf(fp, "%[^,] %[^\n]", name, data) == 2) {
datatype_t *d = (datatype_t*)malloc(sizeof(datatype_t));
d->name = strdup(name);
d->data = strdup(data);
return d;
}
return NULL;
}
CSV文件数据如下
戴夫先生,学校老师
迈克,负责人
Sachin,工作人员
现在我正在读取另一个包含数据的文本文件。
char buffer[66];
if (fgets(buffer,sizeof buffer, fp) != NULL ) {
keydata_t *k = (keydata_t*)malloc(sizeof(keydata_t));
size_t len = strlen(buffer);
if(buffer > 0 && buffer[len-1] == '\n'){
buffer[--len] = '[=12=]';
}
k->name = strdup(buffer);
return k;
}
return NULL;
}
txt 文件的数据如下所示。
戴夫先生
罗恩
蒂姆先生
现在当我比较数据字符串时:
new_ptr = root;
while((keyt = read_key(keyfile))!= NULL){
printf("%s\n", keyt->name);
printf("%s\n", root->key);
if(strcmp(keyt->name, root->key) == 0){
printf("match\n");
}
else if(strcmp(keyt->name, root->key) > 0){
printf("not equal\n");
}
else if (strcmp(keyt->name, root->key) < 0){
printf("not equal\n");
}
new_ptr = search(new_ptr, keyt);
}
一直打印
不等于
即使对于戴夫先生来说,也应该有一场比赛。我似乎无法弄清楚两者的问题。
来自man fgets
:
fgets
从stream中读入至多小于size个字符存入s指向的缓冲区。在 EOF 或换行符后停止阅读。如果读取到换行符,则将其存储到缓冲区中。终止空字节 (aq[=23=]aq) 存储在缓冲区中的最后一个字符之后。
fscanf
不会 将换行符存储在缓冲区中。
请尝试检查 keyt->name
的最后一个符号是什么,如果是换行符则将其删除
首先,您应该将要比较的字符串的每个字符打印为 hex/dec 值。字符串可能包含打印在控制台中但您看不到的字符。可见输出可能看起来相同,但仍然可能不同。打印(例如)十六进制值将准确显示字符串中的内容。
然后如果两个字符串的输出相同并且 strcmp 仍然 return 不是 0 的东西你应该担心(但我相信它不会 :)
我正在使用具有两个字段的 fscanf 读取 CSV 文件。
datatype_t*read(FILE* fp)
{
char name[66];
char data[1466];
if (fscanf(fp, "%[^,] %[^\n]", name, data) == 2) {
datatype_t *d = (datatype_t*)malloc(sizeof(datatype_t));
d->name = strdup(name);
d->data = strdup(data);
return d;
}
return NULL;
}
CSV文件数据如下
戴夫先生,学校老师
迈克,负责人
Sachin,工作人员
现在我正在读取另一个包含数据的文本文件。
char buffer[66];
if (fgets(buffer,sizeof buffer, fp) != NULL ) {
keydata_t *k = (keydata_t*)malloc(sizeof(keydata_t));
size_t len = strlen(buffer);
if(buffer > 0 && buffer[len-1] == '\n'){
buffer[--len] = '[=12=]';
}
k->name = strdup(buffer);
return k;
}
return NULL;
}
txt 文件的数据如下所示。
戴夫先生
罗恩
蒂姆先生
现在当我比较数据字符串时:
new_ptr = root;
while((keyt = read_key(keyfile))!= NULL){
printf("%s\n", keyt->name);
printf("%s\n", root->key);
if(strcmp(keyt->name, root->key) == 0){
printf("match\n");
}
else if(strcmp(keyt->name, root->key) > 0){
printf("not equal\n");
}
else if (strcmp(keyt->name, root->key) < 0){
printf("not equal\n");
}
new_ptr = search(new_ptr, keyt);
}
一直打印
不等于
即使对于戴夫先生来说,也应该有一场比赛。我似乎无法弄清楚两者的问题。
来自man fgets
:
fgets
从stream中读入至多小于size个字符存入s指向的缓冲区。在 EOF 或换行符后停止阅读。如果读取到换行符,则将其存储到缓冲区中。终止空字节 (aq[=23=]aq) 存储在缓冲区中的最后一个字符之后。
fscanf
不会 将换行符存储在缓冲区中。
请尝试检查 keyt->name
的最后一个符号是什么,如果是换行符则将其删除
首先,您应该将要比较的字符串的每个字符打印为 hex/dec 值。字符串可能包含打印在控制台中但您看不到的字符。可见输出可能看起来相同,但仍然可能不同。打印(例如)十六进制值将准确显示字符串中的内容。
然后如果两个字符串的输出相同并且 strcmp 仍然 return 不是 0 的东西你应该担心(但我相信它不会 :)