La concatenazione di stringhe non funziona come previsto [chiusa]


84

So che è un problema comune, ma cercando riferimenti e altro materiale non trovo una risposta chiara a questa domanda.

Considera il codice seguente:

#include <string>

// ...
// in a method
std::string a = "Hello ";
std::string b = "World";
std::string c = a + b;

Il compilatore mi dice che non riesce a trovare un operatore sovraccarico per char[dim].

Significa che nella stringa non c'è un operatore +?

Ma in molti esempi c'è una situazione come questa. Se questo non è il modo corretto per concatenare più stringhe, qual è il modo migliore?


15
Il tuo codice dovrebbe essere compilato correttamente, il che significa che non stai mostrando il codice esatto che causa l'errore (oltre a non pubblicare il messaggio di errore esatto).
sbi

Beh, non funziona ... Probabilmente è colpa mia se non ho fornito il compilatore ... è g ++ non vc ... :)
Andry

Risposte:


153

Il tuo codice, come scritto, funziona. Probabilmente stai cercando di ottenere qualcosa di non correlato, ma simile:

std::string c = "hello" + "world";

Questo non funziona perché per C ++ sembra che tu stia cercando di aggiungere due charpuntatori. Invece, è necessario convertire almeno uno dei char*letterali in un file std::string. O si può fare quello che hai già postato nella questione (come ho detto, questo codice sarà funzionerà) o procedere come segue:

std::string c = std::string("hello") + "world";

3
char * è un puntatore e non può essere aggiunto semplicemente perché richiede un'allocazione di memoria. std :: strings nascondono l'allocazione, ecco perché è possibile fornire un operatore + per loro.
Vincent Robert

12
@Andry: Il motivo per cui questo non funziona è che C ++ eredita le sue stringhe letterali da C, motivo per cui sono del tipo const char[], piuttosto che std::string. In C (e quindi anche in C ++) gli array decadono in puntatori molto facilmente, motivo per cui "a" + "b" richiamerà l'operatore incorporato che aggiunge due puntatori. Il risultato di ciò (un puntatore che punta da qualche parte nella memoria) è ovviamente abbastanza inutile, ma tuttavia questo è ciò con cui siamo bloccati.
sbi

2
@Andry: ragionevole ma sbagliato. L'assegnazione non ha nulla a che fare con questo. La spiegazione data da @sbi è quella corretta (a parte il fatto che il risultato dell'addizione di un puntatore non è un altro puntatore - è semplicemente impossibile aggiungere due puntatori, poiché il risultato sarebbe privo di significato).
Konrad Rudolph,

1
Inoltre, i valori letterali stringa direttamente adiacenti vengono automaticamente concatenati dal compilatore. std::string c = "Hello" "world";, ad esempio, risulterà in c == "Helloworld".
Fang

1
Puoi anche usare stringhe letterali: std;:string c = "hello"s + "world"s;o semplicemente crearne uno std::string.
Rakete 1111


5

Lo farei:

std::string a("Hello ");
std::string b("World");
std::string c = a + b;

Che si compila in VS2008.


1
Dovrebbe funzionare anche in gcc.
graham.reeds

5
std::string a = "Hello ";
std::string b = "World ";
std::string c = a;
c.append(b);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.