C ++中的字符串比较如何工作?

时间:2014-08-15 14:29:29

标签: c++ string palindrome

我正在尝试解决this problem

我用字符串实现它。这是我的代码片段

string s,ss;
// s and ss both contains integer input.

while(s <= ss )
//while( s<=ss && s.size() <= ss.size())
{
    int i = inc, j = dec;   // inc and dec are middle values. both equal if odd else different

    while((s[j]-'0')==9 && i < len && j>=0){
        // for cases like 999
        s[i] = s[j] = '0';
        i++;
        j--;
    }
    if(j<0){
        s = "1" + s;
        int l = s[len-1] - '0';
        l++;
        //cout<<l<<"\n";
        s[len] = (l + '0');
    }
    else{
        int l = s[j] - '0';
        l++;
        s[i] = s[j] = (l+'0');
    }

    if(s <= ss)
        cout<<"out in wild "<<s<<" and "<<ss<<"\n";
}

cout<<s<<endl;

我面临的问题是当输入类似于999或9999.即使s的值增加,外部while循环也会继续循环,但如果我添加while( s<=ss && s.size() <= ss.size())它完全正常。为什么while(s <= ss)不起作用?我很少使用string类,所以我完全不理解它。为什么string s= 101ss=99不会停止while循环?

完整的代码链接是here

3 个答案:

答案 0 :(得分:4)

您正在将字符串与lexicographical order进行比较,而非数字,因此“101”小于“99”(因为“1”<9'),例如

int main(){
    std::string s = "99";
    std::string ss = "101";

    std::cout << std::boolalpha << (s <= ss);  
}

输出false

备注:

  • 为您的程序设计一个更好的设计是操纵数字(intdouble ...)而不是首先处理字符串,所以这种表达式自然会起作用你期待。

    E.g。 “101”+“99”是“10199”,而不是“200”......

  • 但如果您确实需要字符串,请考虑this post对包含数字的字符串进行排序。

  • 正如@Deduplicator所指出的,一个不必要地过度使用字符串的程序有时被称为Stringly Typed

  • 另见std::lexicographical_compare


由于您的输入明确只涉及正整数而没有前导0 ,因此编写比较函数是微不足道的,例如:(未经测试)

/* Returns 1 if the integer represented by s1 > the integer represented by s2
*  Returns -1 if the integer represented by s1 < the integer represented by s2
*  Return 0 is both are equals
*
*  s1 and s2 must be strings representing positive integers without trailing 0
*/
int compare(const std::string& s1, const std::string& s2)
{
  if(s1.size() > s2.size())
      return 1;
  if(s2.size() > s1.size())
      return -1;

  for(std::size_t i = 0 ; i < s1.size() ; ++i)
  {
    if(s1[i] - '0' < s2[i] - '0')
      return 1;
    if(s2[i] - '0' < s1[i] - '0')
      return -1;
  }

  return 0;
}

答案 1 :(得分:0)

虽然 s ss 是字符串变量,但它们会逐个字符地进行比较。

如果你提到:s = "101"&amp; ss = "99",第一只手会检查每个字符串中的第一个字符,而'1' < '9'则会使用 s &lt; SS 。我会建议你在比较之前将这些值转换为整数。

答案 2 :(得分:0)

当s与字典顺序中的ss进行比较时,我建议你将尾部的一个字符与头部的一个字符(逐个到达中间)进行比较以解决该问题。