hoe converteer je van int naar char*?

De enige manier die ik ken is:

#include <sstream>
#include <string.h>
using namespace std;
int main() {
  int number=33;
  stringstream strs;
  strs << number;
  string temp_str = strs.str();
  char* char_type = (char*) temp_str.c_str();
}

Maar is er een methode waarbij je minder hoeft te typen?


Antwoord 1, autoriteit 100%

  • Gebruik in C++17 std::to_chars als:

    std::array<char, 10> str;
    std::to_chars(str.data(), str.data() + str.size(), 42);
    
  • Gebruik in C++11 std::to_string als:

    std::string s = std::to_string(number);
    char const *pchar = s.c_str();  //use char const* as target type
    
  • En in C++03 is wat je doet prima, behalve dat je const gebruikt als:

    char const* pchar = temp_str.c_str(); //dont use cast
    

Antwoord 2, autoriteit 10%

Ik denk dat je een sprintf kunt gebruiken :

int number = 33;
char* numberstring[(((sizeof number) * CHAR_BIT) + 2)/3 + 2];
sprintf(numberstring, "%d", number);

Antwoord 3, autoriteit 5%

Je kunt boost gebruiken

#include <boost/lexical_cast.hpp>
string s = boost::lexical_cast<string>( number );

Antwoord 4, autoriteit 3%

C-stijl oplossing zou kunnen zijn om itoa te gebruiken , maar een betere manier is om dit nummer in een string af te drukken met sprintf / snprintf. Controleer deze vraag: Hoe converteer je een integer naar een tekenreeks?

Merk op dat de functie itoa is niet gedefinieerd in ANSI-C en maakt geen deel uit van C++, maar wordt ondersteund door sommige compilers. Het is een niet-standaard functie, dus u moet het gebruik ervan vermijden. Controleer ook deze vraag: Alternatief voor itoa() voor het converteren van integer naar string C++?

Houd er ook rekening mee dat het schrijven van code in C-stijl tijdens het programmeren in C++ als een slechte gewoonte wordt beschouwd en soms wordt aangeduid als “afschuwelijke stijl”. Wil je het echt converteren naar een C-stijl char* string? 🙂


Antwoord 5, autoriteit 3%

Ik zou de const in de laatste regel niet wegtypen, omdat het er met een reden is. Als je niet kunt leven met een const char*, dan kun je beter de char array kopiëren zoals:

char* char_type = new char[temp_str.length()];
strcpy(char_type, temp_str.c_str());

Antwoord 6

Bekijk dit antwoord https://stackoverflow.com/a/23010605/2760919

Verander in jouw geval gewoon het type in snprintf van long (“%ld”) in int (“%n”).


Antwoord 7

Oké.. ten eerste had ik iets nodig dat deed wat deze vraag stelt, maar ik had het SNEL nodig! Helaas is de “betere” manier bijna 600 regels code!!! Excuseer de naam ervan die niets te maken heeft met wat het doet. De juiste naam was Integer64ToCharArray(int64_t value);

https ://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp

Probeer gerust die code op te schonen zonder de prestaties te belemmeren.

Invoer: elke ondertekende 64-bits waarde van minimaal tot maximaal bereik.

Voorbeeld:

std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MAX) << '\n';
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MIN) << '\n';

Uitvoer:

Test: 9223372036854775807
Test: -9223372036854775808

Originele snelheidstests: (Integer64ToCharArray();)

Beste geval 1-cijferige waarde.

Loops: 100.000.000, bestede tijd: 1.381 (milli), tijd per lus 13 (nano)

Erger geval 20-cijferige waarde.

Lussen: 100.000.000, bestede tijd: 22.656 (milli), tijd per lus 226 (nano

Nieuwe ontwerpsnelheidstests: (AddDynamicallyToBuffer();)

Beste geval 1-cijferige waarde.

Loops: 100.000.000, bestede tijd: 427 (milli), tijd per lus 4 (nano)

32-bits slechtste geval – 11-cijferige waarde.

Lussen: 100.000.000, bestede tijd: 1.991 (milli), tijd per lus 19 (nano)

Negatief 1 biljoen in het slechtste geval – 14-cijferige waarde.

Lussen: 100.000.000, bestede tijd: 5.681 (milli), tijd per lus 56 (nano)

64-bits slechtste geval – 20-cijferige waarde.

Loops: 100.000.000, bestede tijd: 13.148 (milli), tijd per lus 131 (nano)

Hoe het werkt!

We voeren een verdeel- en heerstechniek uit en zodra we de maximale lengte van de tekenreeks hebben, stellen we eenvoudig elke tekenwaarde afzonderlijk in. Zoals te zien is in bovenstaande snelheidstests krijgen de grotere lengtes grote prestatiestraffen, maar het is nog steeds veel sneller dan de originele loop-methode en er is geen code veranderd tussen de twee methoden, behalve dat looping niet meer in gebruik is.

In mijn gebruik, vandaar de naam, retourneer ik in plaats daarvan de offset en ik bewerk geen buffer van char-arrays, maar begin ik de vertex-gegevens bij te werken en de functie heeft een extra parameter voor offset, zodat deze niet wordt geïnitialiseerd op -1.

p>


Antwoord 8

Dit is misschien wat laat, maar ik had hetzelfde probleem.
Het converteren naar char werd aangepakt in C++17 met de “charconv”-bibliotheek.

https://en.cppreference.com/w/cpp/utility/to_chars


Antwoord 9

Je kunt ook casten.

voorbeeld:

string s;
int value = 3;
s.push_back((char)('0' + value));

Antwoord 10

Onze integerwaarde converteren naar std::string zodat we kunnen weten hoe lang (hoe lang aantal cijfers).

Vervolgens maken we een char-arraylengte van tekenreeks lettergrootte +1, zodat we onze waarde kunnen kopiëren naar string en vervolgens naar char-array.

#include <string>
char* intToStr(int data) {
    std::string strData = std::to_string(data);
    char* temp = new char[strData.length() + 1];
    strcpy(temp, strData.c_str());
   return temp;
}

LEAVE A REPLY

Please enter your comment!
Please enter your name here

5 × three =

Other episodes