【问题标题】:How to compare two strings that are different sizes如何比较两个不同大小的字符串
【发布时间】:2019-07-14 02:38:00
【问题描述】:

让我们说字符串A = "ABCDEF",字符串B = "ABC"

有没有办法逐个字符地比较这两个字符串?

例如: 假设您想遍历每个字符串,

 for(size of strings)
 if(A.at(i) == B.at(i)
 {
   do something
 }
 else
 {
   do something else
 }

由于它们的大小不同,您无法在 for 循环中执行此操作,还有其他建议吗?

【问题讨论】:

  • 通常,如果字符串的大小不同,它们就不一样了,你就完成了。
  • 您也可以循环执行。问题是:您期望的比较结果是什么?相等/不相等?小于/等于/大于?
  • @NickHalden 你不能直接A == B吗?
  • 那么就做A < B
  • 我不明白。正如其他人所提到的,如果它们的大小不同,它们就不一样了。也许你能解释一下为什么你需要比较不同大小的刺吗?那也许我能理解得更好。

标签: c++ string char compare string-comparison


【解决方案1】:

你不能在 for 循环中这样做,因为它们的大小不同,

您绝对可以循环执行。您可以使用以下算法:

  • 比较字符串的长度
  • 将较短的长度存储在n
  • 在循环中执行n 迭代
  • 决定要对剩余的较长字符串做什么

【讨论】:

    【解决方案2】:

    您还可以查看std::lexicographical_compare 之类的内容。它用于对单词进行排序,因为它们将在字典中进行排序。如果您想确保字符本身以不同的顺序排序,您可以提供一个进行该比较的函数。例如,假设您希望将字母“c”实际排序为“k”。您可以通过以下方式实现:

    bool comp(char c1, char c2)
    {
      c1 = std::tolower(c1);
      c2 = std::tolower(c2);
      c1 = (c1=='c') ? 'k' : c1;
      c2 = (c2=='c') ? 'k' : c2;
      return c1 < c2;
    }
    
    // main.cpp
    std::string str1 = "string c";
    std::string str2 = "string d";
    std::string str3 = "string k";
    
    std::cout << std::boolalpha;
    std::cout << str1 << ( std::lexicographical_compare(str1, str2, comp) ? "<" : ">=" ) << str2 << std::endl;
    std::cout << str1 << ( std::lexicographical_compare(str1, str3, comp) ? "<" : ">=" ) << str3 << std::endl;
    std::cout << str2 << ( std::lexicographical_compare(str2, str3, comp) ? "<" : ">=" ) << str3 << std::endl;
    

    【讨论】:

      【解决方案3】:

      如果您使用std::string,您可以使用compare 函数或使用此类提供的关系运算符进行比较。

      std::string str1 ("green apple");
      std::string str2 ("red apple");
      
      if (str1.compare(str2) != 0)
        std::cout << str1 << " is not " << str2 << '\n';
      

      if (str1 != str2) std::cout << "str1 and str2 are not equal\n";
      

      所有其他关系运算符,即 == = 也可用。在您的情况下,您似乎只需要== of !=

      如果您坚持逐个字符比较字符串,则可以通过多种方式在循环中进行。例如,

      bool equal = true;
      if (str1.length() != str2.length())
           equal = false;
      else 
           for (int i = 0; equal && i < str1.length(); i++) 
              if (str1.at(i) != str2.at(i) 
                 equal = false;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-04
        • 1970-01-01
        • 2021-03-31
        • 1970-01-01
        相关资源
        最近更新 更多