【问题标题】:Problem in comparing strings without assigning to variable比较字符串而不分配给变量的问题
【发布时间】:2020-12-22 12:54:20
【问题描述】:
int i = ("aac" > "aab");
cout << i;

上面的代码没有给我输出 1(应该是)。但是当我将“aac”和“aab”分配给两个单独的字符串变量并使用变量而不是直接使用字符串时(代码附在下面),我得到了所需的输出。

谁能帮帮我?

string s1 = "aac";
string s2 = "aab";
int i = (s1 > s2);
cout << i;

【问题讨论】:

  • ("aac"&gt;"aab"); 将两个指针与两个不同的字符串文字进行比较;不是按字典顺序排列的两个字符串。认为自己很幸运,它本可以给你所期望的答案,但原因与你想象的完全不同。

标签: c++ string string-comparison


【解决方案1】:

"aac" 这样的字面常量不是std::string 对象;相反,它们只是(只读)内存中的数据,在大多数“访问”情况下,它们的第一个元素的地址(即char*指针);因此,它们之间的比较将是这些地址之间的比较——这是您不太可能控制或预测的。

要获得 inline 比较,在您的情况下,您可以使用 inline std::string 构造函数(有时称为“包装器”),如下所示:

    int i=(string("aac")>string("aab"));

或者,使用更“现代”的“花括号”初始化语法:

    int i = (string{ "aac" } > string{ "aab" });

为了更简洁,您可以利用std::string 具有将字符串文字作为参数之一的&gt;(和类似)运算符的版本这一事实;因此,您只需要“包装”其中一个文字,并且可以将上述代码简化为:

    int i = (string{ "aac" } > "aab");

【讨论】:

  • 注意:你可以只用一个包含在 ctor 中的文字来做到这一点。标准库提供了必要的操作符来处理它。
  • 并且也可以使用后缀版本:using std::string_litteral; int i = "aac"s &gt; "aab"s;
  • @Jarod42 那对我来说是新的。
  • @Jarod42 啊哈!但让我困惑的是string_literal的拼写错误(他说,完全是在撒谎)。 :-)
【解决方案2】:

如果使用C风格的char */char []字符串,需要使用strcmplike:

int i = strcmp("aac", "aab");

否则,您只是比较两个字符串的第一个元素的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多