2

だからstd::string == "string-literal"、私は自分の文字列を作成していることを除いて、うまくいくだろう

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

string::nposこれらの両方に文字列"submit"が含まれていますが、 false を返し==ます。実際にはサイズが「異なる」にもかかわらず、サイズが「異なる」という事実に絞り込みました。str.size()7 でstrlen("submit")6 です。これがなぜ==失敗しているのでしょうか。失敗したと思いますが、理由はわかりません... dif の最後の文字が\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