[C++]Dev C++ string to int

08/03/2010 23:55 Masterakio1995#1
Schonwieder ich :P
Also ich versuchs ma gut zu beschreiben.
Ich habe nen string in dem steht 1 und bevor einer fragt warum ich nicht direkt int benutzte es würde dan nicht funktioniern.

Also ich möchte den string in dem 1 steht in eine int variable umwandeln und danach irgendwan wieder zurück wie schaffe ich das? mit atoi habe ich es nicht hingekriegt und auch nicht mit strtoint
08/04/2010 00:25 MrSm!th#2
string im sinne von char array oder oder std::string?

char array:
Code:
const char *str = "1";
int i = atoi(str);

//vorsicht! atoi ist nicht im standard und unterstützt soweit ich weiß nur dezimale zahlen, keine hexadezimalen o.Ä., also lieber strtol

int i = strtol(str,0,0);  //schau die anderen parameter einfach bei google nach. können manchmal nützlich sein
std::string
Code:
std::string str = "1";

int i = strtol(str.c_str(),0,0);

// bin mir nicht mehr sicher, glaube aber, string ist direkt für int überladen, sodass folgendes gehen sollte:

int i = str;

//weshalb es auch so möglich wäre:

const char *str = "1";
std::string tmp(str);

int i = tmp;
08/04/2010 00:50 Shadow992#3
IntToString:
Code:
string IntToString(int i)
{
    char buffer[500];
    string str;
    sprintf(buffer, "%d", i);
    str =buffer;
    return str ;
} // ==> IntToString(int i)
StringToInt:
Code:
int StringToInt(string str)
{
        char buffer[500];
        strcpy(buffer,str.c_str());
        return atoi(buffer);
} // ==> StringToInt(string str)
08/04/2010 01:24 MrSm!th#4
Wie ich schon sagte, strtol > atoi
Nur leider gibts kein strtof, da muss man atof nehmen.

Und warum dieser Umstand? Wie gesagt, eigentlich müsste string für int überladen sein.
08/04/2010 01:27 Shadow992#5
Quote:
Originally Posted by MrSm!th View Post
Wie ich schon sagte, strtol > atoi
Nur leider gibts kein strtof, da muss man atof nehmen.

Und warum dieser Umstand? Wie gesagt, eigentlich müsste string für int überladen sein.
Sicher ist sicher. ;)
08/04/2010 01:36 Masterakio1995#6
dankeschön denke ma auch das was davon funzt aber kan mir das mal einer erklären ? will nix einbinden was ich nicht selber schaffen würde
08/04/2010 01:39 Shadow992#7
Quote:
Originally Posted by Masterakio1995 View Post
dankeschön denke ma auch das was davon funzt aber kan mir das mal einer erklären ? will nix einbinden was ich nicht selber schaffen würde
Was gibts da groß zu erklären?
Wenn man die Befehle kennt, dann kann man sich das alles denken...
Falls du sie nicht kennst, google doch mal. ;)
08/04/2010 03:01 MrSm!th#8
Quote:
Originally Posted by Shadow992 View Post
Sicher ist sicher. ;)
Jo, deswegen empfehle ich auch strtol; atoi ist keine standardfunktion, strtol schon.
Und sie sind eigentlich gleich anzuwenden, nur bietet strtol mehr ;)

@Master:

Wie gesagt, einfach strtol googlen, dann siehst du, welche Parameter es braucht.
Shadow hat dir zwei Implementierungen geschrieben, die über atoi und sprintf (google^^) eine zeichenkette in einen int und umgekehrt konvertieren.
dann wird das ergebnis bei der konvertierung zum string in einen std::string kopiert, da er den anscheinend mehr mag als char* :D
(man könnte auch den char* zurückgeben...)
08/04/2010 11:01 Masterakio1995#9
dankeschön für eure hilfe
#vote4close
08/04/2010 16:50 Bot_interesierter#10
@Shadow992
Deine StringToInt Funktion erzeugt einen Pufferüberlauf auf dem Stack, wenn man versehentlich zu große Strings an sie übergibt.
Man sollte strcpy nicht verwenden ohne vorher die Größe des Strings zu prüfen, es gibt aber auch strncpy dem man als 3tes Argument die maximale Zahl der zu kopierenden Zeichen übergibt, dann wäre die Funktion auch Überlauf sicher.
08/04/2010 17:07 MrSm!th#11
Dann sollte man doch gleich strcpy_s nehmen, die ist noch sicherer und setzt den 0 terminator ;)

Btw wie wärs, wenn man gleich den buffer dynamisch mit new alloziert und sie die länge aus dem parameter holt?
is ja nicht grad mehr code und um einiges sicherer.

ach ja, 500 plätze bei einem string der nur int enthalten soll wtf?
11 plätze sollten reichen, um alle ints anzeigen zu können.
da es eh danach in nen string kopiert wird, ist auch egal, wenn der nutzer evtl noch was hinzufügen soll.

du verstehst es, mir speicher um dich zu schmeißen :'D
08/04/2010 17:36 Shadow992#12
Quote:
Originally Posted by MrSm!th View Post
Dann sollte man doch gleich strcpy_s nehmen, die ist noch sicherer und setzt den 0 terminator ;)

Btw wie wärs, wenn man gleich den buffer dynamisch mit new alloziert und sie die länge aus dem parameter holt?
is ja nicht grad mehr code und um einiges sicherer.

ach ja, 500 plätze bei einem string der nur int enthalten soll wtf?
11 plätze sollten reichen, um alle ints anzeigen zu können.
da es eh danach in nen string kopiert wird, ist auch egal, wenn der nutzer evtl noch was hinzufügen soll.

du verstehst es, mir speicher um dich zu schmeißen :'D
I <3 u.^^
Du verstehst es an allem etwas auszusetzen. :P

Aber du hast schon recht so ein großes Array braucht man normalerweise nicht. Du musst aber auch beachten, dass das Array weg ist, wenn die Funktion zuende ist. Vondaher sehe ich auf den modernen Computern wenig Gefahr von unzureichend Speicher.
08/04/2010 17:56 MrSm!th#13
Dafür bin ich bekannt, aber wenn die Leute damit klarkommen und meine Ratschläge befolgen (solange sie nicht totaler Mist sind oder sie jemand korrigiert), dann wird der Code meist sicherer/effizienter ;)

Quote:
Du musst aber auch beachten, dass das Array weg ist, wenn die Funktion zuende ist. Vondaher sehe ich auf den modernen Computern wenig Gefahr von unzureichend Speicher.
Nein nein, aber wozu denn so viel Speicher alloziieren lassen, wenns nicht nötig ist :p
Speicher is ne kostbare Resource.

Und wie gesagt, der Parameter ist string, also kann mans da ja mindestens machen:

Code:
char *tmpConvertStr = new char[paramStr.length()+1];
strcpy_s(tmpConvertStr,paramStr.length()+1,paramStr.c_str(),paramStr.length());
//done ;O
08/04/2010 22:43 tim66613#14
Quote:
Originally Posted by Shadow992 View Post
StringToInt:
Code:
int StringToInt(string str)
{
        char buffer[500];
        strcpy(buffer,str.c_str());
        return atoi(buffer);
} // ==> StringToInt(string str)
Warum kopierst du den String erst in einen temporären Buffer?

Code:
return strtol(str.c_str(), NULL, 0);
ist doch die viel bessere Lösung.

Quote:
Originally Posted by MrSm!th View Post
Wie ich schon sagte, strtol > atoi
Nur leider gibts kein strtof, da muss man atof nehmen.

Und warum dieser Umstand? Wie gesagt, eigentlich müsste string für int überladen sein.
strtof existiert in der glibc library sowohl unter linux wie auch unter windows.

Ob std::string nun für int überladen ist oder nicht, hängt auch von der verwendeten STL ab.
So hinkt die MS STL noch etwas hinterher, während andere Implementationen bereits den kompletten Standard sowie Große Teile von c++0x implementiert haben.
Quote:
Originally Posted by MrSm!th View Post
Dafür bin ich bekannt, aber wenn die Leute damit klarkommen und meine Ratschläge befolgen (solange sie nicht totaler Mist sind oder sie jemand korrigiert), dann wird der Code meist sicherer/effizienter ;)


Nein nein, aber wozu denn so viel Speicher alloziieren lassen, wenns nicht nötig ist :p
Speicher is ne kostbare Resource.

Und wie gesagt, der Parameter ist string, also kann mans da ja mindestens machen:

Code:
char *tmpConvertStr = new char[paramStr.length()+1];
strcpy_s(tmpConvertStr,paramStr.length()+1,paramStr.c_str(),paramStr.length());
//done ;O
Soweit richtig, aber Stack-Allocation ist um ein vielfaches schneller als Heap-Allocation.

Kind Regards Tim
08/05/2010 00:25 MrSm!th#15
Mag sein, ist eben nicht ganz so performancestark wie statisches, aber es ist sicherer und bei einer String Konvertierung, ist denke ich mal Sicherheit ein bisschen wichtiger als Performance, es sei denn, es geht um ein Programm, dass innerhalb von ein paar Sekunden tausende von Strings parsen muss^^ (zb. bei Spielen)
Da ist dann aber auch schon vorher eine Max-Größe für den String bestimmt, sodass ein Bufferoverflow gar nicht erst entstehen dürfte, anders als bei dieser Funktion, die für möglichst viele Zwecke genutzt werden soll.
Und da es die Funktion aus Shadows http lib ist, könnte es Schwierigkeiten geben, gibt auch mal etwas größere html Files.
Und btw: wer String benutzt anstatt char*, der kann auch new anstatt eines statischen Arrays nutzen :p