umwandeln - int to string c c++




Der einfachste Weg, um int in C++ zu konvertieren (15)

Was ist der einfachste Weg, um von int in äquivalente string in C ++ zu konvertieren. Ich kenne zwei Methoden. Gibt es einen leichteren Weg?

(1)

int a = 10;
char *intStr = itoa(a);
string str = string(intStr);

(2)

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();

Hier ist eine weitere einfache Möglichkeit

char str[100] ; 
sprintf(str , "%d" , 101 ) ;  
string s = str; 

sprintf ist bekannt dafür, beliebige Daten in eine Zeichenkette des erforderlichen Formats einzufügen.

Sie können das char * -Array wie in der dritten Zeile gezeigt in einen String konvertieren.


Benutzen:

#define convertToString(x) #x

int main()
{
    convertToString(42); // Returns const char* equivalent of 42
}

Da "converting ... to string" ein wiederkehrendes Problem ist, definiere ich das Makro SSTR() in einem zentralen Header meiner C ++ - Quellen:

#include <sstream>

#define SSTR( x ) static_cast< std::ostringstream & >( \
        ( std::ostringstream() << std::dec << x ) ).str()

Die Nutzung ist so einfach wie möglich:

int i = 42;
std::string s = SSTR( "i is: " << i );
puts( SSTR( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( SSTR( "Foo is '" << x << "', i is " << i ) );

Das obige ist C ++ 98-kompatibel (wenn Sie C ++ 11 std::to_string nicht verwenden std::to_string ) und benötigt keine Drittanbieter-Includes (wenn Sie Boost lexical_cast<> nicht verwenden können); Beide anderen Lösungen haben jedoch eine bessere Leistung.


Es ist ziemlich einfach, etwas syntaktischen Zucker hinzuzufügen, der es ermöglicht, Strings im Stream stream zu komponieren

#include <string>
#include <sstream>

struct strmake {
    std::stringstream s;
    template <typename T> strmake& operator << (const T& x) {
        s << x; return *this;
    }   
    operator std::string() {return s.str();}
};

Nun können Sie anhängen, was Sie wollen (sofern ein Operator << (std::ostream& ..) dafür definiert ist) strmake() und es anstelle einer std::string .

Beispiel:

#include <iostream>

int main() {
    std::string x =
      strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST";
    std::cout << x << std::endl;
}

Ich verwende normalerweise die folgende Methode:

#include <sstream>

template <typename T>
  std::string NumberToString ( T Number )
  {
     std::ostringstream ss;
     ss << Number;
     return ss.str();
  }

hier ausführlich beschrieben.


Nicht, dass ich weiß, in reinem C ++. Aber eine kleine Änderung von dem, was du erwähnt hast

string s = string(itoa(a));

sollte funktionieren, und es ist ziemlich kurz.


Sie verwenden einen Zählertyp eines Algorithmus zum Konvertieren in eine Zeichenfolge. Ich habe diese Technik von der Programmierung von Commodore 64 Computern bekommen. Es ist auch gut für die Programmierung von Spielen.

  • Sie nehmen die ganze Zahl und nehmen jede Ziffer, die mit Potenzen von 10 gewichtet ist. Nehmen Sie also an, dass die ganze Zahl 950 ist.

    • Wenn die ganze Zahl gleich oder größer als 100.000 ist, subtrahiere 100.000 und erhöhe den Zähler in der Zeichenfolge um ["000000"];
      mach weiter bis keine Nummern mehr auf Position 100.000 sind. Lass eine weitere Zehnerpotenz fallen

    • Wenn die ganze Zahl gleich oder größer als 10.000 ist, subtrahiere 10.000 und erhöhe den Zähler in der Zeichenfolge um ["000000"] + 1 Position;
      mach weiter so, bis keine Zahlen mehr in Position 10.000 sind.

  • Lass eine weitere Zehnerpotenz fallen

  • Muster wiederholen

Ich weiß, dass 950 zu klein ist, um es als Beispiel zu verwenden, aber ich hoffe, Sie haben die Idee.


Wäre es nicht einfacher, Stringstreams zu verwenden?

#include <sstream>

int x=42;            //The integer
string str;          //The string
ostringstream temp;  //temp as in temporary
temp<<x;
str=temp.str();      //str is temp as string

Oder mache eine Funktion:

#include <sstream>

string IntToString (int a)
{
    ostringstream temp;
    temp<<a;
    return temp.str();
}

Wenn Sie Boost installiert haben (was Sie sollten):

#include <boost/lexical_cast.hpp>

int num = 4;
std::string str = boost::lexical_cast<std::string>(num);

Wenn Sie eine Ganzzahl mit einer festen Anzahl von Ziffern schnell in char * umwandeln möchten, das links mit '0' aufgefüllt ist, ist dies ein praktisches Beispiel:

int n = 27;
char s[8];

Wenn Sie eine zweistellige Zahl konvertieren:

*(int32_t*)s = 0x3030 | (n/10) | (n%10) << 8;

Wenn Sie eine dreistellige Zahl konvertieren:

*(int32_t*)s = 0x303030 | (n/100) | (n/10%10) << 8 | (n%10) << 16;

Wenn Sie eine vierstellige Zahl konvertieren:

*(int64_t*)s = 0x30303030 | (n/1000) | (n/100%10)<<8 | (n/10%10)<<16 | (n%10)<<24;

Und so weiter bis zu siebenstelligen Zahlen :)


CString :

int a = 10;
CString strA;
strA.Format("%d", a);

sprintf() ist ziemlich gut für die Formatkonvertierung. Sie können dann die resultierende C-Zeichenfolge der C ++ - Zeichenfolge wie in 1 zuweisen.


Die Verwendung von Stringstream für die Zahlenumwandlung ist gefährlich!

Siehe http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ Dort wird angegeben, dass der operator<< formatierte Ausgaben einfügt.

Abhängig von Ihrem aktuellen Gebietsschema könnte eine Ganzzahl, die größer als 3 Ziffern ist, in eine 4-stellige Zeichenfolge konvertiert werden, wobei ein zusätzliches Tausendertrennzeichen hinzugefügt wird.

ZB könnte int = 1000 in eine Zeichenkette 1.001 . Dies könnte dazu führen, dass Vergleichsoperationen überhaupt nicht funktionieren.

Daher würde ich dringend empfehlen, die std::to_string zu verwenden. Es ist einfacher und macht das, was Sie erwarten.


char * bufSecs = new char[32];
char * bufMs = new char[32];
sprintf(bufSecs,"%d",timeStart.elapsed()/1000);
sprintf(bufMs,"%d",timeStart.elapsed()%1000);

string number_to_string(int x){
    if(!x) return "0";
        string s,s2;
        while(x){
            s.push_back(x%10 + '0');
            x/=10;
        }
    reverse(s.begin(),s.end());
    return s;
}






type-conversion