我无法让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以帮助按用户的建议找到问题,只要我知道如何做到这一点
这是转储:
答案 0 :(得分:1)
因此,这会将您文件中的第一条记录读入act_person
。该文件中的数据将为您提供:
.name = "Mark"
.date = 0x56f821fc
.destination = "\xb5\xd9\xc1\x95\xac\x7f"
.phone = "361444555"
然后,您将读取输入的名称与desitination字段进行比较,而不是令人惊讶的是,它们不匹配。下一条记录的destination
同样似乎是垃圾。
答案 1 :(得分:-1)
使用结构的地址调用read是危险的。绝对不能保证结构的布局。不同的字节排序,不同的填充,不同的大小,time_t是实现定义的。你应该真的改变这个。
strtok修改它检查的字符串。你想要那个吗?特别是字符串" name"。它由strtok调用修改。
不是执行复杂的if语句,而是将值存储到中间变量中,因此您可以使用调试器来检查发生的情况。 strtok调用之前和之后的值是什么?
寻找解决方案的一小时不应该令人沮丧。
(刚刚注意到问题已经改变,因为我输入了答案)。