2

所以我试图简单地做一个std::string == "string-literal"可以正常工作的方法,除了我正在创建我的字符串

std::string str(strCreateFrom, 0, strCreateFrom.find(' '));

并找到返回string::npos现在这两个都包含字符串"submit"但是==返回false,现在我已经将其缩小到尺寸是“不同”的事实,即使它们确实不是。str.size()是 7 和strlen("submit")6。这就是为什么==失败,我认为是,但我不明白为什么......它不应该检查 diff 的最后一个字符是否\0与这种情况下的情况一样吗?

无论如何我可以解决这个问题而不必使用比较并指定长度来比较或更改我的字符串?

编辑:

std::string instruction(unparsed, 0, unparsed.find(' '));
boost::algorithm::to_lower(instruction);

for(int i = 0; i < instruction.size(); i++){
    std::cout << "create from " << (int) unparsed[i] << std::endl;
    std::cout << "instruction " <<  (int) instruction[i] << std::endl;
    std::cout << "literal " << (int) "submit"[i] << std::endl;
}

std::cout << (instruction == "submit") << std::endl;

印刷

create from 83
instruction 115
literal 115
create from 117
instruction 117
literal 117
create from 98
instruction 98
literal 98
create from 77
instruction 109
literal 109
create from 105
instruction 105
literal 105
create from 116
instruction 116
literal 116
create from 0
instruction 0
literal 0

0

编辑:

为了进一步说明我为什么感到困惑,我阅读了 basic_string.h 标头并看到了这个:

/**
   *  @brief  Compare to a C string.
   *  @param s  C string to compare against.
   *  @return  Integer < 0, 0, or > 0.
   *
   *  Returns an integer < 0 if this string is ordered before @a s, 0 if
   *  their values are equivalent, or > 0 if this string is ordered after
   *  @a s.  Determines the effective length rlen of the strings to
   *  compare as the smallest of size() and the length of a string
   *  constructed from @a s.  The function then compares the two strings
   *  by calling traits::compare(data(),s,rlen).  If the result of the
   *  comparison is nonzero returns it, otherwise the shorter one is
   *  ordered first.
  */
  int
  compare(const _CharT* __s) const;

这是从 operator== 调用的,所以我试图找出为什么大小差异很重要。

4

1 回答 1

1

我不太明白你的问题可能需要更多细节,但你可以使用 c 比较,它不应该有空终止计数的问题。你可以使用:

bool same = (0 == strcmp(strLiteral, stdTypeString.c_str());

strncmp 也可用于仅比较 char 数组中给定数量的字符

或尝试修复 stdstring 的创建

您未解析的 std::string 已经很糟糕了。它已经在字符串中包含了额外的 null,所以你应该看看它是如何创建的。就像我之前提到的 mystring[mystring.size() -1] 是最后一个字符而不是终止 null 所以如果你在输出中看到一个 '\0' ,这意味着 null 被视为字符串的一部分。

尝试追溯您解析的输入并继续确保 mystring[mystring.size() -1] 不是 '\0'。

要回答您的大小差异问题:这两个字符串不相同,文字更短并且没有空值。

  • std::string->c_str() [S,u,b,m,i,t,\0,\0] 的内存长度 = 7,内存大小 = 8;
  • 文字记忆 [S,u,b,m,i,t,\0] 长度 = 6,内存大小 = 7;

当它到达文字中的终止 null 时,比较停止比较,但它使用 std::string 的存储大小,即 7 看到文字在 6 处终止,但 std 的大小为 7,它会说 std 更大。

我认为如果您执行以下操作,它将返回字符串是相同的(因为它会创建一个 std 字符串,右侧也有一个额外的 null ):

std::cout << (instruction == str("submit", _countof("submit"))) << std::endl;

PS:这是在获取 char* 并从中生成 std​​::string 时发生的常见错误,通常只使用数组大小​​本身,但这包括 std::string 无论如何都会添加的终止零。我相信这样的事情正在您的输入中发生,如果您在任何地方添加 -1,那么一切都会按预期工作。

于 2013-07-15T03:55:08.610 回答