siDDis Skrevet 4. oktober 2006 Del Skrevet 4. oktober 2006 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
lnostdal Skrevet 4. oktober 2006 Del Skrevet 4. oktober 2006 (endret) 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 4. oktober 2006 av lnostdal Lenke til kommentar
☀ ❄ Skrevet 5. oktober 2006 Del Skrevet 5. oktober 2006 (endret) 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 5. oktober 2006 av Myubi Lenke til kommentar
lnostdal Skrevet 5. oktober 2006 Del Skrevet 5. oktober 2006 (endret) 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 && ./blahstr: 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 6. oktober 2006 av lnostdal Lenke til kommentar
☀ ❄ Skrevet 6. oktober 2006 Del Skrevet 6. oktober 2006 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
siDDis Skrevet 6. oktober 2006 Forfatter Del Skrevet 6. oktober 2006 Ja eg er nok litt forvirra, men øvelse gjer mester så eg får sjå kva eg får til. Lenke til kommentar
lnostdal Skrevet 6. oktober 2006 Del Skrevet 6. oktober 2006 (endret) 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 7. oktober 2006 av lnostdal Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå