如何比较字符串与const char *?

问题描述:

#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 
#include <string.h> 
using namespace std; 
int main() 
{ 
     string cmd; 
     while(strcmp(cmd.c_str(),"exit")==0 && strcmp(cmd.c_str(),"\exit")==0) 
     { 
       cin>>cmd; 
       cout<<cmd; 
     } 
     return 0; 
} 

我被卡住了。如何比较字符串与const char *?

+1

最好是直接将代码中的问题 – 2010-05-28 18:55:02

+0

@布赖恩贴:我去这样做。 – sbi 2010-05-28 18:55:44

+1

另外,如果使用cmd.compare(“exit”)而不是strcmp(cms,c_str(),“exit”),它会更干净== 0 您正在编写C++代码。为什么不利用它呢? – Vagrant 2010-05-28 19:04:33

固定几个小错误后,该作品在我的机器上:

#include <cstdlib> 
#include <cstdio> 
#include <iostream> 
#include <cstring> 
#include <string> 

int main() 
{ 
     std::string cmd; 
     while(std::strcmp(cmd.c_str(),"exit")!=0 
      && std::strcmp(cmd.c_str(),"\\exit")!=0) 
     { 
       std::cin>>cmd; 
       std::cout<<cmd << '\n'; 
     } 
     return 0; 
} 

不过,我不知道为什么要使用std::strcmp()可言。正如您刚刚发现的那样,它不像std::string类那样容易使用。这

while(cmd!="exit" && cmd!="\\exit") 

工作一样好,更容易理解,从而更容易得到正确。

+0

OP可能希望在比较之前将输入字符串转换为小写字母。这允许用户输入“退出”以及“退出”。研究条款是:'std :: transform'和'tolower'。 – 2010-05-28 19:35:02

+0

Unixy上也有'strcasecmp'(也许是Windows)系统,它忽略了大小写。 – Joe 2016-05-02 08:12:51

strcmp当它们相等时返回0。所以我想你想!= 0

当然strcmp不会返回0,因为它不能等于两者。

此外,它看起来像你在你的字符串的开始处有一个反斜杠,你应该用双反斜杠来回避。

,因为你正在测试检查CMD字符串等"exit""\\exit"你而该条件将永远不会计算到true。一个字符串不能同时等于两个值。

可以使用!===运算符将std::string实例与字符串字面值直接进行比较。这使得你的比较更清晰。

注意\e不是有效的转义字符,你需要,如果你的意思是一个文字\\\一倍。

while(cmd == "exit" && cmd == "\\exit") 

显然cmd不能等于在同一时间两个不同的字符串,想必你的意思!=

此外,请考虑std::getline(std::cin, cmd)是否比std::cin >> cmd;更合适。无论哪种情况,您都应该检查读取操作是否成功,否则如果流关闭或进入失败状态,您可能会以无限循环结束。

就我个人而言,如果您想要按照您的代码回显exit命令,我会采用类似的方式。

#include <string> 
#include <iostream> 
#include <ostream> 

int main() 
{ 
    std::string cmd; 
    while (std::getline(std::cin, cmd)) 
    { 
     std::cout << cmd << std::endl; 
     if (cmd == "exit" || cmd == "\\exit") 
      break; 
    } 
    return 0; 
} 
+0

这是正确的答案。 – 2015-09-03 00:13:45

你的问题是条件。

你可能希望做退出循环,当用户进入退出,所以你应该使用:

while(strcmp(cmd.c_str(),"exit")!=0 && strcmp(cmd.c_str(),"\exit")!=0) 

只是几件事情要记住,我重申一些的,是值得重复的建议而(1)次。

  1. 您正在使用C++,它是面向对象的,即它最好将数据和处理它的函数结合在一起。在这种情况下,使用字符串类而不是strcmp提供的字符串比较选项。

  2. 你的程序有一个逻辑错误,它会编译,但我恐怕那不是你想要的。如果(a == x & & a == y)这将始终是错误的,因为除非x = y,否则x和y都不能等于x,y,在您的情况下显然x!= y。

干杯, 帕