Myślałem, że to będzie naprawdę proste, ale wiąże się to z pewnymi trudnościami. Jeżeli mam
std::string name = "John";
int age = 21;
Jak je połączyć, aby uzyskać pojedynczy ciąg "John21"
?
c++
int
concatenation
stdstring
Obediah Stane
źródło
źródło
Boost::lexical_cast
,std::stringstream
,std::strstream
(która jest przestarzała), asprintf
w porównaniusnprintf
.Odpowiedzi:
W porządku alfabetycznym:
#include <string>
)#include <sstream>
(od standardowego C ++)źródło
String(number)
.W C ++ 11 możesz użyć
std::to_string
np .:źródło
Jeśli masz Boost, możesz przekonwertować liczbę całkowitą na ciąg za pomocą
boost::lexical_cast<std::string>(age)
.Innym sposobem jest użycie strumieni ciągów:
Trzecim podejściem byłoby użycie
sprintf
lubsnprintf
z biblioteki C.Inne plakaty sugerują użycie
itoa
. To NIE jest standardowa funkcja, więc kod nie będzie przenośny, jeśli go użyjesz. Istnieją kompilatory, które tego nie obsługują.źródło
sprintf
odpowiedzisnprintf
.źródło
Bezwstydnie skradziony z http://www.research.att.com/~bs/bs_faq2.html .
źródło
s
zmienne stosu, pamięćs
będzie wolna po wywołaniuitos
.s
należy przydzielić ze sterty, afree
po użyciu, prawda?To najprostszy sposób:
źródło
Jeśli masz C ++ 11, możesz użyć
std::to_string
.Przykład:
Wynik:
źródło
name += std::to_string(static_cast<long long>(age));
w VC ++ 2010, jak widać tutajname += std::to_string(age + 0LL);
zamiast tego?Wydaje mi się, że najprostszą odpowiedzią jest użycie
sprintf
funkcji:źródło
źródło
Wtedy twoje użycie wyglądałoby mniej więcej tak
Googled [i przetestowałem: p]
źródło
Ten problem można rozwiązać na wiele sposobów. Pokażę to na dwa sposoby:
Konwertuj liczbę na ciąg za pomocą
to_string(i)
.Korzystanie ze strumieni ciągów.
Kod:
źródło
Jeśli chcesz użyć
+
do konkatenacji czegokolwiek, co ma operator wyjściowy, możesz podać wersję szablonuoperator+
:Następnie możesz napisać swoje konkatenacje w prosty sposób:
Wynik:
To nie jest najbardziej efektywny sposób, ale nie potrzebujesz najbardziej wydajnego sposobu, chyba że wykonujesz dużo konkatenacji w pętli.
źródło
std::string
, więc nie byłby kandydatem w wyrażeniach, w których ciągu nie można zamienić na potrzebny typ. Np.operator+
Nie można tego wykorzystać+
wint x = 5 + 7;
. Biorąc wszystko pod uwagę, nie zdefiniowałbym takiego operatora bez bardzo ważnego powodu, ale moim celem było zaoferowanie odpowiedzi innej niż pozostałe.Jeśli używasz MFC, możesz użyć CString
Managed C ++ ma również formatowanie łańcucha .
źródło
Std :: ostringstream jest dobrą metodą, ale czasami ta dodatkowa sztuczka może się przydać, przekształcając formatowanie w jednowierszowe:
Teraz możesz sformatować ciągi takie jak to:
źródło
Ponieważ pytanie dotyczące Qt zostało zamknięte na korzyść tego, oto jak to zrobić za pomocą Qt:
Zmienna łańcuchowa ma teraz wartość someIntVariable zamiast% 1 i wartość someOtherIntVariable na końcu.
źródło
Istnieje więcej opcji, których można użyć do połączenia liczby całkowitej (lub innego obiektu numerycznego) z ciągiem znaków. To jest Boost.Format
i Karma z Boost.Spirit (v2)
Boost.Spirit Karma twierdzi, że jest jedną z najszybszych opcji konwersji liczby całkowitej na ciąg znaków .
źródło
Częsta odpowiedź: itoa ()
To jest złe.
itoa
jest niestandardowy, jak wskazano tutaj .źródło
Możesz połączyć int z ciągiem znaków, używając podanej poniżej prostej sztuczki, ale pamiętaj, że działa to tylko wtedy, gdy liczba całkowita jest jednocyfrowa. W przeciwnym razie dodaj liczbę całkowitą cyfra po cyfrze do tego ciągu.
źródło
Oto implementacja sposobu dodawania int do ciągu przy użyciu aspektów parsowania i formatowania z biblioteki IOStreams.
źródło
źródło
Jest funkcja, którą napisałem, która przyjmuje liczbę int jako parametr i konwertuje ją na literał łańcuchowy. Ta funkcja zależy od innej funkcji, która konwertuje pojedynczą cyfrę na jej równoważnik char:
źródło
Z biblioteką {fmt} :
Podzbiór biblioteki jest proponowany do standaryzacji jako formatowanie tekstu P0645, a jeśli zostanie zaakceptowany, powyższe stanie się:
Oświadczenie : Jestem autorem biblioteki {fmt}.
źródło
Jako jedna wkładka:
name += std::to_string(age);
źródło