【问题标题】:issue with strcmp() not comparing strings properlystrcmp() 无法正确比较字符串的问题
【发布时间】:2013-10-05 00:22:47
【问题描述】:

这是实际代码,因为它似乎是特定于这里的某些东西。

#include <iostream>
#include <string.h>

using namespace std;

int main()

cout << "  Just say \"Ready\" when you want to start.";
char tempReady[20];
cin >> tempReady;
length = strlen(tempReady);
char* ready = new char[length+1];
strcpy(ready, tempReady);
while((strcmp(ready, "Ready")||strcmp(ready, "ready"))!=0)
   {
   cout << "Try again.";
   cin >> tempReady;
   length = strlen(tempReady);
   delete[] ready;
   ready = new char[length+1];
   strcpy(ready, tempReady);
   }
cout << "Success";

有人发现有什么不对吗?

【问题讨论】:

  • 你没有使用std::string
  • 我不确定——你的程序在我尝试时进入循环(在 MacOS/X 下使用 g++-4.2)。我的猜测是,也许标准输入在字符串的末尾包含了一个回车符或换行符——做一个 cout
  • 它在 Linux 上的 gcc 中为我工作。
  • 您的代码对我有用,问题一定出在您未发布的代码中。尝试发布完整的程序。
  • 要回答这些问题,您需要发布您的实际程序。当然 strcmp 对第一个大写并不挑剔,它希望所有字母都完全匹配。您的问题与您认为的不同,但如果没有看到实际代码,没有人可以帮助您解决这些问题。

标签: c++ string comparison string-comparison strcmp


【解决方案1】:
while((strcmp(ready, "Ready")||strcmp(ready, "ready"))!=0)

应该是

while(strcmp(ready, "Ready") != 0 && strcmp(ready, "ready") != 0)

你写的版本永远是真的。

【讨论】:

  • 这一直是个问题。所有这些挫败感都源于一个简单的逻辑错误。很明显。
【解决方案2】:

以下是一些基本调试的方法,例如准确检查您输入的内容。

using namespace std; 

char* string = new char[6];
cin >> string;

for(int i=0; i<6; ++i)
{
    printf("[%d]: Hex: 0x%x;  Char: %c\n", i, string[i], string[i]);
}

while(strcmp(string, "hello")==0)
{
   cout << "success!";
}

我怀疑您的输入不是hello,(例如hello\n,或hello\r\n,甚至可能是(unicodehello,这使得@987654326 @失败。

但是,您可以使用上面简单的printf 自行检查。

如果您可以返回输入的确切十六进制转储,并声明 strcmp 仍然无法按预期工作,那么我们将值得研究的东西。

【讨论】:

  • @DanO(我不希望如此。自从 SO 开始以来,我一直试图让人们使用调试器......但大多数人甚至不会使用 printf“debugging”)跨度>
  • 我不知道如何使用 printf,但我是直接从 linux 终端输入,输入单词后按回车键一次。我对 strlen 进行了计算,发现正好是 5 个字符,这足以告诉我。
  • WTF 你的意思是你不知道怎么用printf??我将示例代码放在我的答案中。将其复制粘贴到您的程序中。
  • (@DanO:看他的评论。我休息一下。:D)
  • @abelenky 如果只有 stackoverflow 注册可以强制新用户完成 c 基础教程。授予为期一周的注册过程可能会妨碍采用。
【解决方案3】:

C 风格的方法:

char str[256];
if (scanf("%255s", str) == 1 && strcmp(str, "hello") == 0) {
    printf("success");
}

C++ 方法:

std::string str;
if (std::cin >> str && str == "hello") {
    std::cout << "success";
}

现在决定是用 C 还是 C++ 编写代码,只是不要混用

【讨论】:

  • 打印成功时您的代码甚至不会陷入无限循环:)
  • @RobertJørgensgaardEngdahl:是的,虽然 OP 写了 “我会在提示符下输入“hello”,程序不会进入循环” ~> 这听起来像是无限的循环是他真正的目标:D
  • 直到我测试它才发现它是一个无限循环。但至少它无限地夸大了成功,这使得成功非常明显。
  • @user1362548:是的,没关系。这就是为什么我的回答没有提到while。还有一件事:尽量避免使用using namespace std;,这可能会给你带来更多麻烦。例如,您将数组命名为 string,这可能是不明确的,因为它也可以引用 std::string 等。
猜你喜欢
  • 2013-03-12
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多