Bagaimana cara menambahkan char ke std :: string?

175

Berikut ini gagal dengan kesalahan prog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’

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

Saya juga mencoba, berikut ini, yang mengkompilasi tetapi berperilaku secara acak saat runtime:

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

Maaf untuk pertanyaan bodoh ini, tapi saya sudah mencari di sekitar google, yang bisa saya lihat hanyalah "char array to char ptr", "char ptr to char array", dll.

mengantuk
sumber
kesalahan kompiler ya..Aku lupa apa kesalahannya, tapi itu masuk akal.
drowneath
3
Anda memiliki jawaban yang lebih baik di bawah ini, tetapi Anda dapat membuat contoh kedua Anda berfungsi seperti karakter ini d [2] = {'d', 0}; atau hanya char d [2] = "d"; Pada dasarnya, Anda memerlukan 0 untuk mengakhiri string c-style yang Anda berikan untuk menambahkan
sbk
Dokumentasi yang bagus di sini: sgi.com/tech/stl/basic_string.html
Martin York

Jawaban:

225
y += d;

Saya akan menggunakan +=operator alih-alih fungsi bernama.

AraK
sumber
2
mengapa Anda menganggap + = lebih baik daripada push_back? Apakah kurang mengetik atau Anda punya alasan lain?
Glen
4
Ini kurang mengetik. In gcc, basic_string::operator+=hanya panggilan masuk push_back.
eduffy
2
Ini adalah IMO yang lebih alami untuk string. push_back adalah fungsi wadah, dan string adalah yang khusus di STL :)
AraK
6
Mari balikkan pertanyaan itu: Mengapa Anda menganggap push_back lebih baik daripada + =? Menurut pendapat saya, + = jelas dan ringkas.
Jesper
34
Anda ingin berhati-hati dengan hal ini karena jika Anda masuk ke kebiasaan itu, ini akan mengkompilasi baik-baik saja jika yadalah char*bukan std::string. Itu akan menambahkan dkarakter ke pointer y.
Zan Lynx
65

Gunakan push_back():

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

Untuk menambahkan char ke std :: string var menggunakan metode append, Anda harus menggunakan overload ini:

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

Sunting: Anda benar Saya salah memahami parameter size_type, ditampilkan dalam bantuan konteks. Ini adalah jumlah karakter yang akan ditambahkan. Jadi, panggilan yang benar adalah

s.append(1, d);

tidak

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

Atau cara paling sederhana:

s += d;
Patrice Bernassola
sumber
Saya pikir menggunakan sizeof tidak semantik yang benar di sini (meskipun kebetulan berfungsi sebagai sizeof (char) selalu satu). Metode append secara alami lebih berguna jika Anda ingin menambahkan lebih banyak salinan dari karakter yang sama !!!!!!!!!!
UncleBens
1
Mengapa Anda menggunakan sizeof(char)bukan 1? Anda ingin menambahkan satu pengulangan d, jadi katakan saja. Menggunakan di sizeofsini menyesatkan karena menyarankan bahwa kita harus mengetahui appendukuran byte dari tipe data yang digunakan (yang tidak terjadi).
Ferdinand Beyer
Seperti yang dikatakan Unclebens, metode append benar-benar lebih berguna ketika menambahkan karakter yang sama berkali-kali.
Patrice Bernassola
10

Selain yang lain disebutkan, salah satu konstruktor string mengambil char dan jumlah pengulangan untuk char itu. Jadi Anda bisa menggunakannya untuk menambahkan satu char.

std::string s = "hell";
s += std::string(1, 'o');
Brian R. Bondy
sumber
7

Saya menguji beberapa proposisi dengan menjalankannya dalam satu lingkaran besar. Saya menggunakan microsoft visual studio 2015 sebagai kompiler dan prosesor saya adalah 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;

Menurut tes ini, hasilnya adalah:

     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'

Kesimpulan

+= tampaknya lebih bisa dimengerti, tetapi jika Anda keberatan dengan kecepatan, gunakan append

Hugo Zevetel
sumber
Agar jawaban seperti itu bermakna, Anda setidaknya harus memberi tahu kompiler apa yang Anda gunakan, karena hal-hal seperti itu mungkin sangat bervariasi. Memberitahu tentang prosesor Anda bisa menjadi hal yang hebat juga, untuk mendapatkan perkiraan kasar tentang dampak yang sebenarnya mungkin terjadi.
akaltar
Saya menggunakan visual studio 2015. Saya akan mencari gcc untuk melakukan beberapa tes lainnya. Prosesor saya adalah i7, 8 hati, 2,20 Ghz .... Tapi apa pun prosesor saya itu tidak akan berdampak pada std :: implementasi string ... kecuali jika beberapa metode ini multithreaded dan beberapa lainnya tidak.
Hugo Zevetel
Terkadang ini berdampak, terutama jika Anda menunjukkan timing dalam milidetik. Alih-alih, Anda dapat menampilkan dalam persentase relatif terhadap metode tercepat (Jadi kecepatan prosesor yang sebenarnya tidak relevan) Juga pindahkan data itu dari komentar ke jawaban Anda, ini hanya etiket umum StackExchange. Kalau tidak jawaban yang bagus.
akaltar
6

Coba + = operator link teks , append () metode link teks , atau push_back () metode link teks

Tautan dalam pos ini juga berisi contoh cara menggunakan masing-masing API.

Michael Berg
sumber
2

masalah dengan:

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

adalah bahwa Anda harus memiliki 'd' sebagai lawan menggunakan nama char, seperti char d = 'd'; Atau saya salah?

Alex Spencer
sumber
Saya baru saja mencobanya dan itu bekerja dengan baik. Saya miliki char c = 'd'dan saya bisa melakukannya y.push_back(c)tanpa masalah. Jadi tidak ada masalah dengan std::string::push_back()(kecuali bahwa itu lebih lama dari +=).
Franklin Yu
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
}

Perhatikan bahwa dalam semua contoh ini Anda bisa menggunakan literal karakter secara langsung: y += 'd';.

Contoh kedua Anda hampir pasti berhasil, karena alasan yang tidak terkait. char d[1] = { 'd'};tidak bekerja, tetapi char d[2] = { 'd'};(catatan array adalah ukuran dua) akan telah bekerja kira-kira sama const char* d = "d";, dan literal string yang dapat ditambahkan: y.append(d);.

Mooing Duck
sumber
1

Coba gunakan d sebagai pointer y.append (* d)

Ke-2
sumber
Itu berbahaya karena single charbukan string dan tidak memiliki null-terminator. Melakukan hal ini menyebabkan perilaku yang tidak jelas.
Simon Kraemer
Ini salah. *dberarti penunjuk de-referensi dyang merupakan kesalahan sintaks karena dbukan penunjuk.
Franklin Yu
0
str.append(10u,'d'); //appends character d 10 times

Perhatikan saya telah menulis 10u dan bukan 10 untuk berapa kali saya ingin menambahkan karakter; ganti 10 dengan nomor berapa pun.

Ioan Stef
sumber
0

Saya menemukan cara sederhana ... Saya perlu menempelkan chartali yang sedang dibangun dengan cepat. Saya membutuhkan char list;karena saya memberi pengguna pilihan dan menggunakan pilihan itu dalamswitch() pernyataan.

Saya cukup menambahkan yang lain std::string Slist;dan mengatur string baru sama dengan karakter, "daftar" - a, b, c atau apa pun yang dipilih pengguna akhir seperti ini:

char list;
std::string cmd, state[], Slist;
Slist = list; //set this string to the chosen char;
cmd = Slist + state[x] + "whatever";
system(cmd.c_str());

Kompleksitas mungkin keren tetapi kesederhanaan lebih keren. Menurut opini saya

Charles H
sumber
0

Juga menambahkan opsi sisipkan, seperti yang belum disebutkan.

std::string str("Hello World");
char ch;

str.push_back(ch);  //ch is the character to be added
OR
str.append(sizeof(ch),ch);
OR
str.insert(str.length(),sizeof(ch),ch) //not mentioned above
Gopesh Bharadwaj
sumber
-1

Jika Anda menggunakan push_back tidak ada panggilan untuk konstruktor string. Kalau tidak, ia akan membuat objek string melalui casting, maka itu akan menambahkan karakter dalam string ini ke string lain. Terlalu banyak kesulitan untuk karakter kecil;)

progaris
sumber
1
operator + = (char c); kelebihan beban untuk string. Bahkan, konstruktor string tidak menerima satu karakter, lihat jawaban Brian;)
AraK