5

文字リテラルを文字列の最初の要素と比較して、ファイル内のコメントを確認したいと思います。なぜcharを使用するのですか?これを、コメントに文字変数を受け入れる関数にしたいと思います。文字列の長さを1文字に制限したいので、文字列を許可したくありません。

そのことを念頭に置いて、簡単な方法は、文字をアドレス指定してstd::stringのcompare関数に渡すことだと思いました。しかし、これは私に意図しない結果を与えています。

私のコードは次のとおりです。

#include <string>
#include <iostream>

int main ( int argc, char *argv[] )
{
  std::string my_string = "bob";
  char my_char1 = 'a';
  char my_char2 = 'b';

  std::cout << "STRING : " << my_string.substr(0,1) << std::endl
        << "CHAR : " << my_char1 << std::endl;
  if (my_string.substr(0,1).compare(&my_char1)==0)
    std::cout << "WOW!" << std::endl;
  else
    std::cout << "NOPE..." << std::endl;

  std::cout << "STRING : " << my_string.substr(0,1) << std::endl
        << "CHAR : " << my_char2 << std::endl;
  if (my_string.substr(0,1).compare(&my_char2)==0)
    std::cout << "WOW!" << std::endl;
  else
    std::cout << "NOPE..." << std::endl;

  std::cout << "STRING : " << my_string << std::endl
        << "STRING 2 : " << "bob" << std::endl;
  if (my_string.compare("bob")==0)
    std::cout << "WOW!" << std::endl;
  else
    std::cout << "NOPE..." << std::endl;
}

私に...

STRING : b
CHAR : a
NOPE...
STRING : b
CHAR : b
NOPE...
STRING : bob
STRING 2 : bob
WOW!

関数が部分文字列と文字が同じではないと考えるのはなぜですか。charsとstd::string varsを適切に比較する最短の方法は何ですか?

(私の質問の再分類を避けるための短い怒り....スキップしてください)
私が最短と言うとき、私は雄弁をコーディングしたいという願望からそれを意味します。これは宿題の質問ではないことに注意してください。私は化学工学の博士課程の候補者であり、独立した研究の一環としてコーディングを行っています。私の最後の質問の1つは、虐待の境界で考慮した効率について尋ねたときに、ユーザーmsw(これもスナイド発言をしました)によって「宿題」として再分類されました。私のコードは他の人に再利用される場合とされない場合がありますが、読みやすく、保守しやすいものにしようとしています。また、コードを可能な限り効率的にしたいという奇妙な願望もあります。したがって、効率と雄弁さに関する質問。

4

5 に答える 5

15

これを行う:

  if (my_string.substr(0,1).compare(&my_char2)==0)

文字列を「だまして」、nullで終了するC文字列へのポインタを取得していると思わせるため、機能しません。これは、プログラムのクラッシュまで、奇妙な影響を及ぼします。代わりに、通常の等式を使用して、文字列の最初の文字をmy_charと比較します。

 if (my_string[0] == my_char)
   // do stuff
于 2010-08-30T19:06:02.167 に答える
4

文字列にインデックス演算子を使用しないのはなぜですか?char型を返します。

if (my_string[0] == my_char1)
于 2010-08-30T19:08:25.920 に答える
3

文字列のoperator[]を使用して、単一の文字と比較できます

// string::operator[]
#include <iostream>
#include <string>
using namespace std;

int main ()
{
    string str ("Test string");
    int i; char c = 't';
    for (i=0; i < str.length(); i++)
    {
        if (c == str[i]) {
            std::cout << "Equal at position i = " << i << std::endl;
        }
    }
    return 0;
}
于 2010-08-30T19:05:59.067 に答える
1

比較する最初の2つの呼び出しの動作は、各文字のアドレスに続くランダムメモリの内容に完全に依存します。呼び出しbasic_string::compare(const char*)ているので、ここでのパラメーターは、単一の文字ではなく、C文字列(nullで終了)であると見なされます。compare()呼び出しは、目的の文字を比較し、その後に、std :: stringを使用して、その文字の後の次の0x00バイトまでのメモリ内のすべてを比較します。

Otoh <<演算子には、char入力に対して適切なオーバーロードがあるため、出力には、ここで実際に比較しているものが反映されません。

とbのdeclをに変換するとconst char[] a = "a";、あなたが望むことを得ることができます。

于 2010-08-30T19:06:36.930 に答える
1

かなり標準的な、C++の文字列はnullで終了します。文字はそうではありません。したがって、標準の比較方法を使用することで、「b \0」=='b'かどうかを実際にチェックしています。

私はこれを使用して、目的の出力を取得しました。

if (my_string.substr(0,1).compare( 0, 1, &my_char2, 1)==0 )
    std::cout << "WOW!" << std::endl;
else
    std::cout << "NOPE..." << std::endl;

これが言っているのは、部分文字列の位置0から開始し、長さ1を使用して、長さが1の私の文字参照と比較することです

于 2010-08-30T19:26:20.250 に答える