Jaki jest najkrótszy sposób, najlepiej wbudowany, aby przekonwertować int na łańcuch? Odpowiedzi za pomocą STL i Boost będą mile widziane.
to_stringlikestd::string s = std::to_string(42)
Jaki jest najkrótszy sposób, najlepiej wbudowany, aby przekonwertować int na łańcuch? Odpowiedzi za pomocą STL i Boost będą mile widziane.
to_stringlikestd::string s = std::to_string(42)
Odpowiedzi:
Możesz użyć std :: to_string w C ++ 11
int i = 3;
std::string str = std::to_string(i);
boost::lexical_cast<std::string>(yourint) z boost/lexical_cast.hpp
Działa na wszystko dzięki obsłudze std :: ostream, ale nie jest tak szybka, jak na przykład itoa
Wydaje się nawet, że jest szybszy niż stringstream lub scanf:
lexical_cast, co przynosi, ale czuję, że Boost jest dość przesadą dla tego rodzaju zadań ...
Dobrze znanym sposobem na to jest użycie operatora strumienia:
#include <sstream>
std::ostringstream s;
int i;
s << i;
std::string converted(s.str());
Oczywiście możesz uogólnić to dla dowolnego typu używając funkcji szablonu ^^
#include <sstream>
template<typename T>
std::string toString(const T& value)
{
std::ostringstream oss;
oss << value;
return oss.str();
}
#include <sstream>.
std::;)
Jeśli nie możesz używać std::to_stringz C ++ 11, możesz napisać to tak, jak jest zdefiniowane na cppreference.com:
std::string to_string( int value )Przekształca podpisane całkowitą dziesiętną na sznurku z tej samej treści jak costd::sprintf(buf, "%d", value)przyniosłoby dla dostatecznie dużych buf.
Realizacja
#include <cstdio>
#include <string>
#include <cassert>
std::string to_string( int x ) {
int length = snprintf( NULL, 0, "%d", x );
assert( length >= 0 );
char* buf = new char[length + 1];
snprintf( buf, length + 1, "%d", x );
std::string str( buf );
delete[] buf;
return str;
}
Możesz z tym zrobić więcej. Po prostu użyj "%g"do konwersji float lub double na string, użyj "%x"do konwersji int na reprezentację szesnastkową i tak dalej.
Niestandardowa funkcja, ale jest zaimplementowana w większości popularnych kompilatorów:
int input = MY_VALUE;
char buffer[100] = {0};
int number_base = 10;
std::string output = itoa(input, buffer, number_base);
Aktualizacja
C ++ 11 wprowadził kilka std::to_stringprzeciążeń (zwróć uwagę, że domyślnie jest to base-10).
ostreamprace, jak również, aż trzeba zapisać numer ciąg jako coś innego niż binarny, ósemkowy, lub w formacie szesnastkowym (np base-32).
itoa()lub stricmp()są podawane jako odpowiedź na cokolwiek .
sprintfmogę również osiągnąć cel PO (chociaż nadal cierpi z powodu braku elastyczności, jeśli potrzebne jest coś innego niż wspólne liczby podstawowe).
Poniższe makro nie jest tak kompaktowe, jak jednorazowe ostringstreamlubboost::lexical_cast .
Ale jeśli potrzebujesz wielokrotnie konwersji na ciąg w swoim kodzie, to makro jest bardziej eleganckie w użyciu niż bezpośrednia obsługa strumieni ciągów lub jawne rzutowanie za każdym razem.
Jest również bardzo wszechstronny, ponieważ konwertuje wszystko, co jest obsługiwane operator<<(), nawet w połączeniu.
Definicja:
#include <sstream>
#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
( std::ostringstream() << std::dec << x ) ).str()
Wyjaśnienie:
Jest std::decto sposób na przekształcenie anonimowości ostringstreamw rodzaj ogólny, wolny od skutków ubocznych, ostreamdzięki czemu operator<<()wyszukiwanie funkcji działa poprawnie dla wszystkich typów. (W przeciwnym razie będziesz miał kłopoty, jeśli pierwszy argument jest typem wskaźnikowym.)
dynamic_castZwraca wpisać plecami do ostringstreamtak można wywołać str()na nim.
Posługiwać się:
#include <string>
int main()
{
int i = 42;
std::string s1 = SSTR( i );
int x = 23;
std::string s2 = SSTR( "i: " << i << ", x: " << x );
return 0;
}
inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }zrobiłbyś? (Nie testowałem, ale zastanawiam się, co poszłoby nie tak i dlaczego?
int(mój pierwszy przykład). Ale bez ostreamwidoczne dla kompilatora w main(jak to jest ukryty wewnątrz funkcji szablonu), będzie starał się patrzeć operator<<()na const char []moim drugim przykładzie - który będzie rechot. Wiem, że OP wymagał tylko rozszerzenia int, ale to bardziej ogólne makro jest tak przydatne (i właściwie dość rozpowszechnione), że pomyślałem, że umieściłem je tutaj.
Możesz uwzględnić implementację itoa w swoim projekcie.
Oto itoa zmodyfikowana do pracy ze std :: string: http://www.strudel.org.uk/itoa/
#include <string>
#include <stdlib.h>
Oto kolejny łatwy sposób konwersji int na string
int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());
możesz odwiedzić ten link, aby uzyskać więcej metod https://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/
Przypuśćmy, że tak integer = 0123456789101112. Teraz ta liczba całkowita może zostać przekonwertowana na łańcuch przez stringstreamklasę.
Oto kod w C ++:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i;
string s;
stringstream st;
for(i=0;i<=12;i++)
{
st<<i;
}
s=st.str();
cout<<s<<endl;
return 0;
}