Gå til innhold

itoa() for GCC/ Linux ?


Anbefalte innlegg

itoa() er ikkje standard i ansi C

 

Eg prøver å få til noko som likner uten den men får det ikkje heilt til

 

itoa funksjonen ser sånn ut

 

char* itoa( int value, char* result, int base ) 
{
// check that the base if valid
if (base < 2 || base > 16) 
{
 *result = 0; return result;
}
char* out = result;
int quotient = value;

do {
 *out = "0123456789abcdef"[ std::abs( quotient % base ) ];
 ++out;
 quotient /= base;
} while ( quotient );

// Only apply negative sign for base 10
if ( value < 0 && base == 10) *out++ = '-';
std::reverse( result, out );
*out = 0;
return result;
}

 

Men når eg sender desse verdiane

itoa(0, "", 10);

 

Så får eg opp feilmeldinga:

 

error: too many arguments to function 'char* itoa()'

 

Kvifor skjer det?

Lenke til kommentar
Videoannonse
Annonse

hm, før vi gjør noe mer; er ikke snprintf (man 3 snprintf) "god nok"..?

 

#include <stdio.h>
#include <stdlib.h>


#define STR_MAXSIZE 100

int main(int argc, char* argv[], char* env[]){
 char str[STR_MAXSIZE];
 snprintf(str, STR_MAXSIZE, "%d", 1234);
 printf("str: %s\n", str);
 return 0;}

 

lars@ibmr52:~/programming/c$ gcc -g -Wall a.c -o a && ./a
str: 1234

 

edit:

ser du nevner ANSI C, men så blander du inn C++ .. i C++ har man muligheter som:

 

#include <sstream>
....
template<typename T>
inline std::string toStr(T const& source)
{
 std::ostringstream oss;
 oss << source;
 return(oss.str());
} // toStr


template<class T>
inline char* toCStr(T const& source)
{
 std::ostringstream oss;
 oss << source;
 return(const_cast<char*>(oss.str().c_str()));
} // toCStr


template<class T>
inline char const* toCCStr(T const& source)
{
 std::ostringstream oss;
 oss << source;
 return(oss.str().c_str());
} // toCCStr

Endret av lnostdal
Lenke til kommentar

For å gi en litt mer no-bullshit C++-versjon:

 

#include <sstream>
#include <string>

int main()
{
    int x = 5;
    std::stringstream ss;
    ss << x;
    
    // Konvertering til std::string:
    ss.str();
    // Konvertering til (const?) char*:
    ss.str().c_str();
}

 

 

 

Edit: Glemte å legge til BBcode for å få en søt kodesnuttboks rundt

Endret av Myubi
Lenke til kommentar

ja, `c_str' returnerer `char const*':

http://www.cppreference.com/cppstring/c_str.html

 

edit: ser forøvrig ikke forskjellen, eller gjør så klart det - men "less bullshit"? - man går fra tall (og andre typer) til strenger.. det fungerer og det er åpenbart hvordan man bruker dette, men:

 

#include <sstream>
#include <iostream>

using namespace std;


template<typename T>
inline std::string toStr(T const& source){
  std::ostringstream oss;
  oss << source;
  return(oss.str());}


template<class T>
inline char* toCStr(T const& source){
  std::ostringstream oss;
  oss << source;
  return(const_cast<char*>(oss.str().c_str()));} 


template<class T>
inline char const* toCCStr(T const& source){
  std::ostringstream oss;
  oss << source;
  return(oss.str().c_str());}



void someFunction(char const* s){
 // A lot of functions only accept const strings.
 cout << "someFunction, s: " << s << endl;}  


int main(char* argc[], char* argv[], char* env[]){
 int i = 1234;

 string str = toStr(i);
 cout << "str: " << str << endl;

 char* cstr = toCStr(i);
 cout << "cstr: " << cstr << endl;

 someFunction(toCCStr(i));

 
 cout << "LITERALS:" << endl;
 cout << toStr(4321) << endl;
 cout << toCStr(4321) << endl;
 cout << toCCStr(4321) << endl;  
 
 return 0;}

lars@ibmr52:~/programming/c$ g++ -Wall -g blah.cpp -o blah && ./blah

str: 1234

cstr: 1234

someFunction, s: 1234

LITERALS:

4321

4321

4321

 

f.eks. er dette mye klarere når man skal gjøre ting som:

...
int a = toType<int>(gui_entry_a.text());
int b = toType<int>(gui_entry_b.text());
gui_label_sum.text(toCCStr(a + b));
...

 

..eller, samlet; ennå mindre temporaries:

 

gui_label_sum.text(toCCStr(toType<int>(gui_entry_a.text()) +
                           toType<int>(gui_entry_b.text())));

 

altså..fremfor å måtte strø rundt seg med temporaries for `stringstream'-objekter..

 

edit2:

jeg kan godt poste et innlegg der jeg tar med definisjonen av `toType' også - og legger det hele i en komplett kjørende kodesnutt med `main' og alt slikt definert, men `toType' & Co. er uansett beskrevet her:

 

* http://nostdal.org/~lars/programming/c/oxy...til/strutil.hpp

* http://nostdal.org/~lars/programming/c/oxy...til/strutil.tpp

* http://nostdal.org/~lars/programming/c/oxy...til/strutil.cpp

 

edit3:

er man opptatt av hastighet (ikke at stringstream er tregt ellernoe) så tror jeg kanskje det vil være mulig å øke hastigheten (men miste thread-safety) om man bruker en felles (static) `stringstream'-temporary mellom de forskjellige hjelpe-funksjonene og mellom hver gang man kaller en av disse - men jeg har ikke testet dette noe videre

Endret av lnostdal
Lenke til kommentar

Med «less-bullshit» mente jeg bare at jeg bare skrev et relevant kodeeksempel, fremfor en rekke templatiserte hjelpefunksjoner. Ikkenoe galt med koden din, jeg tenkte bare at dersom trådstarter er ny med språket vil templates sannsynligvis forvirre ham (og/eller virke «automagisk»), slik at han kanskje ikke fikk like mye ut av koden.

Lenke til kommentar
Med «less-bullshit» mente jeg bare at jeg bare skrev et relevant kodeeksempel, fremfor en rekke templatiserte hjelpefunksjoner. Ikkenoe galt med koden din, jeg tenkte bare at dersom trådstarter er ny med språket vil templates sannsynligvis forvirre ham (og/eller virke «automagisk»), slik at han kanskje ikke fikk like mye ut av koden.

7014945[/snapback]

 

ok

 

siDDis: tips; det er ikke alltid det er "skadelig" å bruke ting man ikke forstår helt 100% ennå .. man kommer til templates i papirlefsa fort nok ..

 

edit: rettet uklar formulering

Endret av lnostdal
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...