繁体   English   中英

Strcmp不会为两个相同的字符串返回零

[英]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文件数据如下

戴夫先生,学校老师
迈克·黑德
萨钦,工作人员

现在,我正在读取另一个包含数据的文本文件。

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] = '\0';
}
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从流中读取的字符数最多不超过大小字符,并将它们存储到s指向的缓冲区中。 在EOF或换行符之后停止读取。 如果读取换行符,则将其存储到缓冲区中。 终止空字节(aq \\ 0aq)存储在缓冲区中的最后一个字符之后。

fscanf 不会在缓冲区中存储换行符。

请尝试检查keyt->name的最后一个符号是什么,如果是换行符,请将其删除

首先,您应该将要比较的字符串的每个字符打印为十六进制/十进制值。 字符串可能包含在控制台中打印的字符,但您看不到它们。 可见的输出可能看起来相同,但仍可能不同。 打印(例如)十六进制值将准确显示字符串中的内容。

然后,如果两个字符串的输出都相同,而strcmp仍返回除0以外的值,则您应该担心(但我敢肯定不会:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM