【问题标题】:Testing string equality issue测试字符串相等问题
【发布时间】:2014-02-11 01:30:37
【问题描述】:

有一段时间没有用 C 编程了,所以我肯定在这里遗漏了一些东西,但我不知道它是什么。

我有两个字符串,如下图:

char toMatch[] = "--exit--";
char entry[1024];

通过这个程序,我有一个 while 循环,它接受用户输入来修改整个程序中的字符串 entry。当entry 等于toMatch 时,我想退出这个while 循环。

我认为使用 strcmp 函数很容易做到这一点,但由于某种原因它无法正常工作。原来我有这个:

while(strcmp(entry, toMatch) != 0) {
    // accept user input here to modify entry
}

但是,这不起作用。所以在再次接受用户输入之前,我添加了一行代码来清除entry的内容:

while(strcmp(entry, toMatch) != 0) {
    memset(entry, 0, sizeof(entry));
    // accept user input here to modify entry
}

这也不起作用。我需要让entry 这么长,因为用户的条目可以是比这更小的任何长度。我不知道为什么 strcmp() 不起作用,所以我认为我遗漏了一些应该很明显的东西。

【问题讨论】:

  • 向我们展示要求您输入字符串的代码
  • 你知道 ==0 是相等的,而 0 是不相等的,对吧?除此之外,您是否打印出两个字符串的值 - 最好在它们之前和之后使用一个字符,例如'"',以使空格可见 - 以确认您确实在比较您认为的内容比较?
  • 用户输入可能以换行符结尾。尝试将 tomatch 设置为“--exit--\n”。

标签: c


【解决方案1】:

如果你总是用零明确地写比较,使用strcmp() 就很容易了:

  • strcmp(a, b) == 0 表示平等
  • strcmp(a, b) != 0 表示不等式
  • strcmp(a, b) >= 0 for a 排序等于或在 b 之后
  • strcmp(a, b) > 0a 排序在 b 之后
  • strcmp(a, b) <= 0a 排序等于或之前 b
  • strcmp(a, b) < 0a 排序在 b 之前

如果您在匹配"--exit--" 与您的输入时遇到问题,您是否去除了前导空格、尾随空格、尾随换行符(尤其是后者,如果您使用fgets() 读取输入)。这说明了什么:

printf("[[%s]]\n", entry);

方括号显示程序认为字符串的结尾在哪里。

【讨论】:

  • 这正是问题所在。我有尾随空白,这导致了问题。谢谢!
猜你喜欢
  • 2012-06-22
  • 1970-01-01
  • 2012-09-08
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2020-07-30
相关资源
最近更新 更多