Strcmp在相等的字符串上不返回相等

时间:2016-03-27 17:57:57

标签: c string strcmp

我无法让strcmp为相同的字符串返回0。

这是我的代码看起来的方式(无论如何相关部分):

struct person{
    char name[30];
    time_t date;
    char destination[30];
    char phone[30];
};

在主要我有:

struct person act_person;
int f = open("persons.txt", O_RDONLY | O_CREAT, S_IRUSR);
if(f == -1){
    //open error
}
char city_name[30]; 
scanf(" %[^\n]s", city_name);
city_name[strcspn(city_name, "\n")] = 0;
//lseek(f, 0, SEEK_SET); //took it out as user alk suggested
while(read(f, &act_person, sizeof(act_person))){ 
     act_person.destination[strcspn(act_person.destination, "\n")] = 0;
     if(strcmp(act_person.destination,city_name)==0){
            printf("%s\n",act_person.name);
     }
}
close(f);

我读取的文件是用类似字节大小的人体结构编写的,所以它应该可以工作......但无论我做什么,strcmp都不会返回相等的。

编辑:我将尝试显示文件的hexdump以帮助按用户的建议找到问题,只要我知道如何做到这一点

这是转储:

Hexdump of persons.txt

2 个答案:

答案 0 :(得分:1)

因此,这会将您文件中的第一条记录读入act_person。该文件中的数据将为您提供:

.name = "Mark"
.date = 0x56f821fc
.destination = "\xb5\xd9\xc1\x95\xac\x7f"
.phone = "361444555"

然后,您将读取输入的名称与desitination字段进行比较,而不是令人惊讶的是,它们不匹配。下一条记录的destination同样似乎是垃圾。

答案 1 :(得分:-1)

  1. 使用结构的地址调用read是危险的。绝对不能保证结构的布局。不同的字节排序,不同的填充,不同的大小,time_t是实现定义的。你应该真的改变这个。

  2. strtok修改它检查的字符串。你想要那个吗?特别是字符串" name"。它由strtok调用修改。

  3. 不是执行复杂的if语句,而是将值存储到中间变量中,因此您可以使用调试器来检查发生的情况。 strtok调用之前和之后的值是什么?

  4. 寻找解决方案的一小时不应该令人沮丧。

  5. (刚刚注意到问题已经改变,因为我输入了答案)。

    1. 随机更改很少有帮助。检查通过调试发生的事情。了解出了什么问题。弄清楚如何解决问题。然后解决问题。