使用循环进行词典字符串比较

Lexicographical string comparison using loops

本文关键字:字符串 比较 循环      更新时间:2023-10-16

我想按字典顺序比较两个长度相等的字符串,其中包含拉丁字母。大写和小写字母被视为相同。

这是我的代码:

string in1,in2;
getline(cin,in1);
getline(cin,in2);
int l=in1.length();
for(int i=0;i<l;++i){
in1[i]=tolower(in1[i]);
in2[i]=tolower(in2[i]);
}
int sum1=0;
int sum2=0;
for(int i=0;i<l;++i){
sum1=sum1 + int(in1[i]);
sum2=sum2 + int(in2[i]);
}
if(sum1==sum2)
cout<<"0"<<endl;
if(sum1<sum2)
cout<<"-1"<<endl;
if(sum1>sum2)
cout<<"1"<<endl;

但是,这在某些测试条件下会产生错误。

这是怎么回事?

您可以使用比较函数

int x = in1.compare(in2);
if(x == 0)
cout<<"Both are Equal";
else if (x > 0) 
cout << in1 << " is greater than "<< in2 << endl; 
else
cout << in2 << " is greater than "<< in1 << endl; 

我认为这是错误的,因为它不考虑字符的顺序。例如,"ab"和"ba"将获得相同的总和。

您可以将strcmpstd::stringC字符串提取器一起使用c_str()。这是一个完整的工作解决方案:

#include <iostream>
#include <string>
#include <string.h>
int main(int argc, char **argv)
{
std::string s1("aabad");
std::string s2("abaaaaaaa");
if (strcmp(s1.c_str(),s2.c_str()) <  0) std::cout << "s1 <  s2n";
if (strcmp(s1.c_str(),s2.c_str()) >  0) std::cout << "s2 <  s1n";
if (strcmp(s1.c_str(),s2.c_str()) == 0) std::cout << "s1 == s2n";
return 0;
}

您肯定可以使用标准库为std::string类型提供的运算符:

operator==
operator!=
operator<             lexicographically compares two strings
operator>             (function template)
operator<=
operator>=

有关更多信息,请参阅此处。