it-swarm.com.de

Wie hängt man ein Zeichen an einen std :: string an?

Folgendes schlägt mit dem Fehler prog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’ fehl

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

Ich habe auch folgendes versucht, das kompiliert, sich aber zur Laufzeit zufällig verhält:

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

Entschuldigung für diese dumme Frage, aber ich habe in Google gesucht. Was ich sehen konnte, sind "Char Array to Char Ptr", "Char Ptr to Char Array" usw.

143
drowneath
y += d;

Ich würde += Operator anstelle von benannten Funktionen verwenden.

181
AraK

Verwenden Sie Push_back():

std::string y("Hello worl");
y.Push_back('d')
std::cout << y;
53
Ferdinand Beyer

Um einem std :: string var mit der append-Methode ein Zeichen hinzuzufügen, müssen Sie diese Überladung verwenden:

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

Edit: Sie haben Recht. Ich habe den Parameter size_type falsch verstanden, der in der Kontexthilfe angezeigt wird. Dies ist die Anzahl der hinzuzufügenden Zeichen. Also ist der richtige Anruf

s.append(1, d);

nicht

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

Oder der einfachste Weg:

s += d;
17

Zusätzlich zu den anderen genannten Funktionen nimmt einer der String-Konstruktoren ein Zeichen und die Anzahl der Wiederholungen für dieses Zeichen an. Damit können Sie ein einzelnes Zeichen anhängen.

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

Ich teste die verschiedenen Vorschläge, indem ich sie in einer großen Schleife ausführe. Ich verwendete Microsoft Visual Studio 2015 als Compiler und mein Prozessor ist ein 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;

Nach diesem Test sind die Ergebnisse:

     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'

Fazit

+= scheint verständlicher zu sein, aber wenn Sie Geschwindigkeit brauchen, verwenden Sie anhängen

7
Hugo Zevetel

Versuchen Sie den + = Operator Linktext , Append () Methode Linktext , Oder Push_back () Methode Linktext

Die Links in diesem Beitrag enthalten auch Beispiele zur Verwendung der jeweiligen APIs.

6
Michael Berg

das Problem mit:

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

ist, dass Sie das 'd' haben müssen, anstatt den Namen eines Zeichens zu verwenden, z. Oder liege ich falsch?

2
Alex Spencer

Verwenden Sie das d als Zeiger Y.append (* d)

2
2ndless
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
}

Beachten Sie, dass Sie in all diesen Beispielen direkt ein Zeichenliteral verwenden konnten: y += 'd';.

Ihr zweites Beispiel fast hätte aus unabhängigen Gründen funktioniert. char d[1] = { 'd'}; hat nicht funktioniert, aber char d[2] = { 'd'}; (beachte, dass das Array die Größe 2 hat) wäre ungefähr genauso wie const char* d = "d"; bearbeitet worden, und ein String-Literal can kann angehängt werden: y.append(d);.

1
Mooing Duck
str.append(10u,'d'); //appends character d 10 times

Beachten Sie, dass ich 10u und nicht 10 geschrieben habe, wie oft ich den Charakter anhängen möchte. Ersetzen Sie 10 durch eine beliebige Zahl.

0
Ioan Stef

Ich fand einen einfachen Weg ....__ Ich musste eine char an eine Schnur anheften, die gerade gebaut wurde. Ich brauchte einen char list;, da ich dem Benutzer eine Auswahlmöglichkeit gab und diese Option in einer switch()-Anweisung verwendete.

Ich fügte einfach einen weiteren std::string Slist; hinzu und setzte die neue Zeichenkette gleich dem Zeichen "list" - a, b, c oder was auch immer der Endbenutzer wählt:

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

Komplexität mag kühl sein, aber Einfachheit ist kühler. meiner bescheidenen Meinung nach

0
Charles H