C ++字符串和字符串文字比较

时间:2013-07-15 03:48:13

标签: c++ string comparison

所以我试着简单地做一个std::string == "string-literal",它可以正常工作,除了我用

创建我的字符串
std::string str(strCreateFrom, 0, strCreateFrom.find(' '));

并找到返回string::npos现在这两个包含字符串"submit"但是==返回false,现在我已经缩小了这个大小是“不同”的事实,即使他们真的不是。 str.size()是7而strlen("submit")是6.这就是==失败的原因,我认为它是但我不明白为什么......不应该检查是否...在这种情况下,dif的最后一个char是\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;

从运营商调用==所以我试图找出尺寸差异的原因。

1 个答案:

答案 0 :(得分:1)

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

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-&gt; c_str()的内存[S,u,b,m,i,t,\ 0,\ 0] length = 7,内存大小= 8;
  • 文字记忆[S,u,b,m,i,t,\ 0]长度= 6,记忆大小= 7;

比较停止比较它何时达到文字中的终止空值,但是它使用存储的大小为std :: string,即7,文本终止于6,但是std是7,它会说std更大

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

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

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