我想如果我使用“>”之类的运算符和“<”在c ++中比较字符串,这些将按字典顺序比较它们,问题是这只在我的计算机中有效。 例如
if("aa" > "bz") cout<<"Yes";
这将不打印任何内容,这就是我需要的内容,但如果我输入
if("aa" > "bzaa") cout<<"Yes";
这将打印“是”,为什么会发生这种情况?或者我是否应该使用其他方式来按字典顺序比较字符串?
答案 0 :(得分:21)
比较std::string
之类的将工作。但是,您正在比较字符串文字。要进行比较,您需要使用它们初始化std :: string或使用strcmp:
if(std::string("aa") > std::string("bz")) cout<<"Yes";
这是c ++风格的解决方案。
或者:
if(strcmp("aa", "bz") > 0) cout<<"Yes";
编辑(感谢Konrad Rudolph的评论):实际上在第一个版本中,只应明确转换其中一个操作数:
if(std::string("aa") > "bz") cout<<"Yes";
将再次按预期工作。
答案 1 :(得分:2)
您正在比较类型为char const *
的“原始”字符串。
以下内容基本上等同于您的示例:
char const * s1 = "aa";
char const * s2 = "bz";
if ( s1 > s2 ) cout<<"Yes";
这是比较指针(字符串的内存地址),而不是内容。
@izomorphius提出了一些很好的解决方案。
答案 2 :(得分:0)
您可以使用strcmp()
头文件中包含的#include <cstring>
函数。 strcmp()
逐字符比较两个字符串。该过程将继续进行,直到达到NULL
或其中一个字符串不相等(字符不相等)为止。
例如:
#include <iostream>
#include <cstring>
void display(char *lhs, char *rhs, int result)
{
if(result > 0)
std::cout << rhs << " precedes " << lhs << std::endl;
else if (result < 0)
std::cout << lhs << " precedes " << rhs << std::endl;
else
std::cout << lhs << " and " << rhs << " are same" << std::endl;
}
int main()
{
char lhs[] = "aa";
char rhs[] = "bz";
int result;
result = strcmp(lhs,rhs);
display(lhs,rhs,result);
result = strcmp(lhs,lhs);
display(lhs,lhs,result);
return 0;
}
输出:
aa precedes bz
aa and aa are same