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
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;
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*
(man könnte auch den char* zurückgeben...)
@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.
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
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.
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
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
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
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
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
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.
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
String.au3 09/11/2010 - AutoIt - 2 Replies Hey,
hat jemand die Datei für mich?
Ich finde im Internet nichts (ich hoffe ich habe nichts übersehn)
Mfg
Englische String.txt? 05/27/2010 - Metin2 Private Server - 0 Replies Gibt es eine Englische String.txt?
Also wo alles englisch ist
C# String zum Key 05/05/2010 - .NET Languages - 7 Replies Hallo liebe User,
Ich habe seit langer Zeit ein Problem das mich ne Weile beschäftigt.
Es geht um Hotkeys und Strings..
Was ich machen will:
Ich habe jetzt diesen Code:
[HELP]Wrong String 09/14/2009 - Dekaron Private Server - 21 Replies http://www.dekaron-legendz.com/Photos/bug1.jpg
well this is my Summy skill Book . .
and i cant see the string name for that skill book .
any idea how to change the name to Ex. " Fury Explosion "
thanks .
Getting ID String for RPE 07/15/2009 - Ragnarok Online - 0 Replies Is there any way for getting ID String for account ID than using openkore ? openkore doesn't work on my server, I need to get the String ID so I can use RPE filter.
Does anyone know the solution for this ?