2009-09-24 5 views
111

は、次のエラーで失敗しprog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’std :: stringにcharを追加するには?

int main() 
{ 
    char d = 'd'; 
    std::string y("Hello worl"); 
    y.append(d); // Line 5 - this fails 
    std::cout << y; 
    return 0; 
} 
私も試み

、コンパイルしますが、実行時にランダムに振る舞う以下、このばかな質問のための

int main() 
{ 
    char d[1] = { 'd' }; 
    std::string y("Hello worl"); 
    y.append(d); 
    std::cout << y; 
    return 0; 
} 

申し訳ありませんが、私の周りに検索しました私が見ることができるものGoogleは、など、単に "char型のPTRにchar型の配列"、 "配列をcharへのchar PTR"、ある

+0

あなたが何を意味するかを追加します失敗によって? – decasteljau

+0

コンパイラエラーはい。私はエラーが何かを忘れましたが、それは妥当です。 –

+2

あなたは以下のより良い答えを持っていますが、このように2番目の例を働かせることができます。d [2] = {'d'、0};または単にchar d [2] = "d";基本的には、Cスタイルの文字列を終了させるために0が必要です。 – sbk

答えて

149
y += d; 

名前付き関数の代わりに+=演算子を使用します。

+1

なぜpush = backよりも優れていると思いますか?それはちょうど入力が少ないか、別の理由がありますか? – Glen

+3

入力が少なくなっています。 'gcc'では、' basic_string :: operator + = 'は' push_back'の単なる呼び出しです。 – eduffy

+2

文字列の方が自然なIMOです。 push_backはコンテナ関数であり、文字列はSTLの特殊な文字です:) – AraK

43

使用push_back()

std::string y("Hello worl"); 
y.push_back('d') 
std::cout << y; 
5

は+ =演算子link text、 のappend()メソッドlink text、 又は一back()メソッドこの記事でlink text

リンクは、それぞれのAPIを使用する方法の例が含まれていてみてください。

7

前述の他にも、文字列コンストラクタの1つは、charとそのcharの繰り返し回数を受け取ります。 これを使うと、1つのcharを追加できます。

std::string s = "hell"; 
s += std::string(1, 'o'); 
-1

push_backを使用している場合、文字列コンストラクタの呼び出しはありません。それ以外の場合は、キャストを介して文字列オブジェクトを作成し、この文字列の文字を他の文字列に追加します。小さな文字のためにあまりにも多くの問題;)

+1

演算子+ =(char c);文字列のためにオーバーロードされます。実際には、文字列コンストラクタは1文字を受け付けません.Brian答えを参照してください;) – AraK

16

appendメソッドを使用してのstd ::文字列VARに文字を追加するには、このオーバーロードを使用する必要があります。

std::string::append(size_type _Count, char _Ch) 

編集: Your're私は、コンテキストヘルプに表示されるsize_typeパラメータを誤解していました。これは、追加する文字数です。だから、正しい呼び出しが

s.append(1, d); 

ない

s.append(sizeof(char), d); 

それとも最も単純な方法です:

s += d; 
+0

sizeof(sizeof(char)は常に1であるように動作しますが、sizeofは意味的には正しくありません。あなたが同じ文字のより多くのコピーを追加したい場合、appendメソッドは自然にもっと便利です!!!!!!!!!! – UncleBens

+1

なぜ '1 'の代わりに' sizeof(char) 'を使用していますか?あなたはちょうど 'd'の1つの繰り返しを追加したいと思っています。ここで 'sizeof'を使うと誤解を招きます。なぜなら、使用されているデータ型のバイトサイズを' append'に伝えなければならないからです。 –

+0

Unclebensが述べたように、appendメソッドは、同じ文字を何度も追加するときに本当に便利です。 –

1

に問題:

std::string y("Hello worl"); 
y.push_back('d') 
std::cout << y; 

は、あなたが持っている必要があるということです「d」は「opp」 char d = 'd'のように、charの名前を使用することにosedします。または私は間違っていますか?

0
str.append(10u,'d'); //appends character d 10 times 

私は文字を追加したい回数分10Uなく10を書かれている注意してください。 10を何に置き換えてください。

+3

これはすでに約4年前に掲載されています。 – Mat

1
int main() 
{ 
    char d = 'd'; 
    std::string y("Hello worl"); 

    y += d; 
    y.push_back(d); 
    y.append(1, d); //appending the character 1 time 
    y.insert(y.end(), 1, d); //appending the character 1 time 
    y.resize(y.size()+1, d); //appending the character 1 time 
    y += std::string(1, d); //appending the character 1 time 
} 

これらの例の全てで、あなたが直接リテラル文字を使用している可能性があること注:y += 'd';を。

第2の例ほぼは、関連しない理由で機能していました。 char d[1] = { 'd'};は機能しませんでしたが、は、const char* d = "d";とほぼ同じように処理され、文字列リテラルが追加されました。y.append(d);となりました。char d[2] = { 'd'};(配列はサイズ2です)。

1

私は大きなループにそれらを実行することにより、いくつかの提案をテスト(* D)

+0

単一の 'char'が文字列でなく、ヌルターミネーターがないので、危険です。これを行うと、未定義の動作が発生します。 –

4

ポインタ y.appendとしてDを使用してみてください。 私はVisual Studio 2015をコンパイラとして使用し、プロセッサはi7,8Hz、2GHzです。

long start = clock(); 
    int a = 0; 
    //100000000 
    std::string ret; 
    for (int i = 0; i < 60000000; i++) 
    { 
     ret.append(1, ' '); 
     //ret += ' '; 
     //ret.push_back(' '); 
     //ret.insert(ret.end(), 1, ' '); 
     //ret.resize(ret.size() + 1, ' '); 
    } 
    long stop = clock(); 
    long test = stop - start; 
    return 0; 

は、この試験によると、結果は以下のとおりです。

 operation    time(ms)   note 
------------------------------------------------------------------------ 
append      66015 
+=       67328  1.02 time slower than 'append' 
resize      83867  1.27 time slower than 'append' 
push_back & insert   90000  more than 1.36 time slower than 'append' 

結論

+=は、より理解しやすいようだが、あなたはスピードについて気にしている場合、使用が

+0

このような答えが意味をなさないためには、コンパイラがどのコンパイラを使用しているかを少なくとも知っておく必要があります。 あなたのプロセッサーについて伝えることは、これが実際に及ぼす可能性のある影響についての概算を得るためにも素晴らしいことがあります。 – akaltar

+0

私はビジュアルスタジオ2015を使用しました。私はいくつかのテストを行うためにgccを探します。私のプロセッサはi7、8個の心臓、2.20GHzです。しかし、私のプロセッサはどんなものであれ、std :: stringの実装には何の影響もありません。これらのメソッドの中にはマルチスレッド化されているものと、他のものが存在しないものがあります。 –

+0

タイミングがミリ秒単位で表示されている場合は、特に影響があります。代わりに、最も速い方法に比例してパーセンテージで表示することができます(実際のプロセッサの速度は関係ありません)。コメントから回答にそのデータを移動します。これは一般的なStackExchangeエチケットです。それ以外の素晴らしい答え。 – akaltar

関連する問題