Std :: string'e karakter nasıl eklenir?


175

Aşağıdakiler hatayla başarısız oluyor 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;
}

Ben de denedim, hangi derleme ama zamanında rasgele davranır:

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

Bu aptal soru için özür dilerim, ama google'da aradım, görebildiğim sadece "char ptr char char", "char ptr to char array", vb.


bir derleyici hatası evet .. Hatanın ne olduğunu unuttum, ama makul.
Eylül0

3
Aşağıda daha iyi yanıtlarınız var, ancak bu örnek gibi çalışan ikinci bir örnek yapabilirsiniz. D [2] = {'d', 0}; veya sadece char d [2] = "d"; Temel olarak, eklemek için geçtiğiniz c tarzı dize sonlandırmak için 0 gerekir
SBK

İyi dokümantasyon burada: sgi.com/tech/stl/basic_string.html
Martin York

Yanıtlar:


225
y += d;

Ben kullanırım +=isimli fonksiyonların yerine operatörü.


2
neden + = push_back 'den daha iyi düşünüyorsunuz? Daha az yazmak mı yoksa başka bir nedeniniz mi var?
Glen

4
Daha az yazıyor. In gcc, basic_string::operator+=sadece bir çağrı push_back.
eduffy

2
Dizeler için daha doğal IMO'dur. push_back konteyner işlevidir ve bir dize STL'de uzmanlaşmış bir dildir :)
AraK

6
Bu soruyu tersine çevirelim: Push_back'i neden + = 'den daha iyi buluyorsunuz? Bence + = açık ve özlü.
Jesper

34
Buna dikkat etmek istersiniz, çünkü alışkanlığa girerseniz y, bunun char*yerine iyi bir şekilde derlenecektir std::string. dY işaretçisine karakterler ekler .
Zan Lynx

65

Kullanım push_back():

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

19

Append yöntemini kullanarak bir std :: string var dosyasına bir karakter eklemek için şu aşırı yüklemeyi kullanmanız gerekir:

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

Düzenleme: Haklısın, bağlam yardımında görüntülenen size_type parametresini yanlış anladım. Bu eklenecek karakter sayısıdır. Yani doğru çağrı

s.append(1, d);

değil

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

Veya en basit yol:

s += d;

Sizeof kullanmanın anlamsal olarak doğru olmadığını düşünüyorum (sizeof (char) olarak çalışmak her zaman birdir). Aynı karakterin daha fazla kopyasını eklemek istiyorsanız, ekleme yöntemi doğal olarak daha kullanışlıdır !!!!!!!!!!
UncleBens

1
Neden sizeof(char)yerine kullanıyorsun 1? Tam olarak bir tekrarı eklemek istiyorsunuz d, sadece söyleyin. sizeofBurada kullanmak yanıltıcıdır, çünkü appendkullanılan veri türünün bayt boyutunu belirtmesi gerektiğini gösterir (durum böyle değildir).
Ferdinand Beyer

Unclebens'in dediği gibi, ekleme karakteri aynı karakteri birçok kez eklerken gerçekten daha kullanışlıdır.
Patrice Bernassola

10

Bahsedilen diğerlerine ek olarak, dize yapıcılarından biri bir karakter ve bu karakter için tekrar sayısını alır. Böylece bunu tek bir karakter eklemek için kullanabilirsiniz.

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

7

Birkaç önermeyi büyük bir döngü halinde çalıştırarak test ediyorum. Derleyici olarak microsoft visual studio 2015 kullandım ve işlemcim 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;

Bu teste göre sonuçlar:

     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'

Sonuç

+= daha anlaşılır görünüyor, ancak hızı düşünürseniz append kullanın


Böyle bir cevabın anlamlı olması için, en azından hangi derleyiciyi kullandığınızı söylemelisiniz, çünkü bu tür şeyler çok farklı olabilir. İşlemciniz hakkında bilgi vermek, bunun gerçek etkileri hakkında kabaca bir tahmin almak için de harika olabilir.
akaltar

Visual studio 2015'i kullandım. Diğer bazı testleri yapmak için gcc'yi arayacağım. bu yöntemlerden bazılarının çok iş parçacıklı olması ve birisinin olmaması dışında.
Hugo Zevetel

Bazen, özellikle milisaniye cinsinden zamanlamaları gösteriyorsanız, bunun bir etkisi vardır. Bunun yerine en hızlı yönteme göre yüzde olarak gösterebilirsiniz (Yani gerçek işlemci hızı önemsizdir) Ayrıca bu verileri yorumdan yanıtınıza taşıyın, bu sadece genel StackExchange görgü kurallarıdır. Aksi takdirde güzel cevap.
akaltar


2

sorun:

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

char d = 'd' gibi bir char adı kullanmak yerine 'd' ye sahip olmanız gerektiğidir; Yoksa yanılıyor muyum?


Sadece denedim ve iyi çalıştı. Ben var char c = 'd've ben sorunsuz yapabilirsiniz y.push_back(c). Yani hiçbir sorun yoktur std::string::push_back()(daha uzun olması hariç +=).
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
}

Tüm bu örnekler içinde doğrudan bir karakter değişmezi kullanılmış olabilir ki Not: y += 'd';.

İkinci örneğiniz , ilgisiz nedenlerden dolayı neredeyse işe yarardı. char d[1] = { 'd'};değil işi, ama did char d[2] = { 'd'};(not dizi boyutunda ikidir) kabaca çalıştı aynı olurdu const char* d = "d";ve dize olabilir eklenecek: y.append(d);.


1

D işaretini y işaretçisi olarak kullanmayı deneyin. Append (* d)


Tek bir chardize olmadığı ve boş sonlandırıcısı olmadığı için bu tehlikelidir . Bunu yapmak tanımsız davranışa neden olur.
Simon Kraemer

Bu sadece yanlış. bir işaretçi olmadığından sözdizimi hatası olan *dreferans işaretçisi anlamına gelir . dd
Franklin Yu

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

Karakteri eklemek istediğim sayıda 10u değil 10u yazdım ; 10'u herhangi bir sayı ile değiştirin.


0

Basit bir yol buldum ... Aniden yapýlan charbir ipe takýlmam gerekiyordu . Bir kullanıcıya ihtiyacım vardı char list;ve bir switch()ifadede bu seçimi kullanarak bir ihtiyacım vardı .

Ben sadece başka bir ekledi std::string Slist;ve karakter, "liste" - a, b, c veya son kullanıcının böyle seçtiği ne olursa olsun yeni dize eşit ayarlayın:

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());

Karmaşıklık serin olabilir, ancak sadelik daha serindir. Benim nacizane fikrime göre


0

Ayrıca, daha önce belirtilmeyen ekleme seçeneği de eklendi.

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

-1

Push_back kullanıyorsanız, string yapıcısı için çağrı yoktur. Aksi takdirde, döküm yoluyla bir dize nesnesi oluşturur, daha sonra bu dizedeki karakteri diğer dizeye ekler. Küçük bir karakter için çok fazla sorun;)


1
operatör + = (karakter c); dizeler için aşırı yüklenmiş. Aslında, dize oluşturucu bir karakteri kabul etmez, bkz. Brian cevap;)
AraK
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.