Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 20:28

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



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

Discussion on [C++]Dev C++ string to int within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Masterakio1995's Avatar
 
elite*gold: 8
Join Date: Apr 2009
Posts: 2,977
Received Thanks: 855
[C++]Dev C++ string to int

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
Masterakio1995 is offline  
Old 08/04/2010, 00:25   #2


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
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;
MrSm!th is offline  
Old 08/04/2010, 00:50   #3
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
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)
Shadow992 is offline  
Thanks
1 User
Old 08/04/2010, 01:24   #4


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
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.
MrSm!th is offline  
Thanks
1 User
Old 08/04/2010, 01:27   #5
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
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.
Shadow992 is offline  
Thanks
1 User
Old 08/04/2010, 01:36   #6
 
Masterakio1995's Avatar
 
elite*gold: 8
Join Date: Apr 2009
Posts: 2,977
Received Thanks: 855
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
Masterakio1995 is offline  
Old 08/04/2010, 01:39   #7
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
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.
Shadow992 is offline  
Thanks
1 User
Old 08/04/2010, 03:01   #8


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
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*
(man könnte auch den char* zurückgeben...)
MrSm!th is offline  
Thanks
1 User
Old 08/04/2010, 11:01   #9
 
Masterakio1995's Avatar
 
elite*gold: 8
Join Date: Apr 2009
Posts: 2,977
Received Thanks: 855
dankeschön für eure hilfe
#vote4close
Masterakio1995 is offline  
Old 08/04/2010, 16:50   #10
 
elite*gold: 20
Join Date: Sep 2006
Posts: 1,100
Received Thanks: 184
@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.
Bot_interesierter is offline  
Old 08/04/2010, 17:07   #11


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
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
MrSm!th is offline  
Thanks
1 User
Old 08/04/2010, 17:36   #12
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
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.
Shadow992 is offline  
Old 08/04/2010, 17:56   #13


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
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
MrSm!th is offline  
Thanks
1 User
Old 08/04/2010, 22:43   #14
 
elite*gold: 577
Join Date: Oct 2009
Posts: 665
Received Thanks: 3,502
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
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
tim66613 is offline  
Old 08/05/2010, 00:25   #15


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
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
MrSm!th is offline  
Reply


Similar Threads Similar Threads
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 ?



All times are GMT +1. The time now is 20:29.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.