【问题标题】:Strcmp does not return equal on equal strings [closed]strcmp 在相等的字符串上不返回相等 [关闭]
【发布时间】:2016-03-27 17:57:56
【问题描述】:

我无法让 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 以帮助找到用户建议的问题

这里是转储:

【问题讨论】:

  • 您应该进行一些调试 - 检查每个字符串中包含的字节值。
  • 一般评论:我理解你很沮丧,但最后的抱怨并没有增加问题。他们只是让我想“这个人很生气。如果我试图帮助他们,他们会生我的气吗?”
  • 因此,您可能需要冷静下来,然后重新阅读您的问题,以确保其中包含有人需要提供帮助的所有内容。请注意,像“它不起作用”这样的短语是含糊的而且没有帮助 - 究竟会发生什么?创建minimal complete verifiable example 也会有所帮助 - 现在没有人可以测试您的代码,因为您遗漏了部分内容,而且我们也不知道输入文件包含什么。
  • 向我们展示一个hexdump -C 文件,例如,128 字节。
  • 了解如何使用 GDB。在使用 C 时,它是一个非常宝贵的工具。此外,我强烈建议您在遇到这些问题时不要在同一行上调用 3 个函数。尝试char *act_person_tok = ... 之类的方法以及另外两个电话也分别在不同的行上。也许在两者之间打印它们,或者使用 GDB 的 p 函数。祝你调试好运。此外,C 是一种“令人沮丧”的语言,因为它不会握住你的手。如果您需要握住您的手,请使用其他东西。就那么简单。在这个网站上生气不会让你有任何收获。

标签: c string strcmp


【解决方案1】:

所以这会将文件中的第一条记录读入act_person。文件中的数据将为您提供:

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

然后,您将读取输入的名称与目标字段进行比较,不出所料,它们不匹配。下一条记录的destination 似乎也是垃圾。

【讨论】:

  • 我怀疑你的目的地有点不对劲。您显示的字节来自目标的偏移量 8。
  • 假设目的地以记录偏移量 32 开始:第一条记录的目的地以 0xfc 0x21 开始。
  • Err 好的,我刚刚解决了部分问题。现在 strcmp 似乎可以工作,但仅适用于文件上最后一个“struct” syzed 字节。
  • 我的印象是 while(read(etc)) 会读取整个文件,一次读取一个 struct syzed 数据,但由于某种原因,它似乎只读取最后一个条目?跨度>
  • @alk:日期将在偏移量 32 (0x20),目的地在偏移量 40 (0x28),电话在偏移量 70 (0x46)。
【解决方案2】:
  1. 使用结构的地址调用 read 是危险的。绝对不能保证结构的布局。不同的字节顺序,不同的填充,不同的大小,time_t 是实现定义的。你真的应该改变这一点。

  2. strtok 修改它检查的字符串。你想要那个吗?尤其是字符串“name”。它由 strtok 调用修改。

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

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

(刚刚注意到问题在我输入答案后发生了变化)。

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

【讨论】:

  • 是的,我拿出了 strtok 并使用了其他人的建议。稍后我会尝试看看这些值是什么。
猜你喜欢
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多