Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Alternative zu stoi?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.11.2015, 01:49 Uhr
Yadgar



Hi(gh)!

Während ich das Höhenlinien-Interpolations-Projekt erst einmal etwas beiseite gelegt habe, arbeite ich meinem alten Vorhaben eines kommandozeilenbasierten Bildbearbeitungsprogramm weiter ("yip - Yadgar's Image Processor").

Ich begann mit drei ganz einfachen Kommandos, nämlich -help (zeigt LIste der verfügbaren Kommandos an), -i bzw. -invert (invertiert ein Bild) und c- bzw. -create. Letzteres erzeugt ein einfarbiges Bild mit als Parametern angegebenen Seitenlängen. Die Syntax ist

yip -c (oder -create) <width>x<height> rgb(<r>,<g>,<b>

Falls also der zweite Parameter von main() "-c" oder "-create" lautet und es dazu noch einen dritten Parameter gibt, der ein x enthält, soll ein Substring bis zum x extrahiert werden und dieser Substring dann in eine integer-Zahl umgewandelt werden. Da mir das Substring-Handling bei einfachen char-Arrays zu kompliziert erschien, wandelte ich den Parameter in ein String-Objekt um, also

string(argv[2])

womit stoi die passende Funktion zur Umwandlung nach Integer wäre. Unpraktisch dabei ist allerdings, dass ungeeignete Strings nicht abgefangen werden, sondern das Programm mit einer Systemfehlermeldung abbricht.

Was stellt C++ (gerne auch C++11) sonst an Möglichkeiten bereit, einen String in eine Zahl umzuwandeln? Oder muss ich mir selbst eine Funktion schreiben?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.11.2015, 08:22 Uhr
ao

(Operator)


std::stringstream.

Den string in einen stringstream rein (per <<-operator oder Konstruktor) und in die Zahl-Variable wieder raus (mit >>

std::stringstream ss(thestring);
ss >> thevalue;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.11.2015, 14:45 Uhr
Yadgar




Zitat von ao:
std::stringstream.

Den string in einen stringstream rein (per <<-operator oder Konstruktor) und in die Zahl-Variable wieder raus (mit >>

std::stringstream ss(thestring);
ss >> thevalue;


Was kommt denn da raus, falls der String nicht nur Ziffern enthält? Das muss er nämlich bei meiner Problemstellung - es geht um das Parsing einer Parameterliste von main().

Zwischenzeitlich habe mich mir selbst eine (oder besser zwei) Funktion(en) dazu programmiert:


C++:
bool isnum(char c)
{
  if (c >= 48 && c <= 57)
    return true;
  else
    return false;
}
      
int str2pint(string sub)
{
  unsigned int c;
  int n = 0;
  c = sub.size();
  while (c > 0)
  {
    c--;
    if (isnum(sub.at(c)) == false)
      return -1;
    else
      n += (sub.at(c)-48)*pow(10, sub.size()-1-c);
  }
  return n;
}



Da als Seitenlängen-Angaben für yip -create sowieso nur positive Zahlen größer 0 sinnvoll sind, gibt str2pint() im Fehlerfall -1 zurück.

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.11.2015, 15:50 Uhr
ao

(Operator)



Zitat von Yadgar:
Was kommt denn da raus, falls der String nicht nur Ziffern enthält?

Dann stoppt die Ausgabe beim ersten Zeichen, das nicht umgewandelt werden kann. Das musst du dann auf andere Weise aus dem Stream holen, und dann kann es mit der nächsten Zahl weitergehen. Z.B. so:


C++:
#include <string>
#include <sstream>
#include <iostream>

int main ()
{
    std::string s = "1024x768";
    
    std::stringstream ss (s);
    
    int width;
    ss >> width;
    
    char x;
    ss >> x;
    
    int height;
    ss >> height;
    
    std::cout << s << " decoded as "
        << width << x << height
        << std::endl;
    
    
    return 0;
}


Da es sich bei deinen Daten um menschengetippte Eingaben handelt, muss das Ganze natürlich noch ein bisschen fehlersicher sein.

Aber es lohnt sich wirklich, sich mal mit diesen Stream-Operatoren zu beschäftigen. Es ist eine eigene Denkweise, aber man kriegt sehr eleganten Code heraus, der auf Dateien, Konsolen-IO, Memory-Streams und dergleichen funktioniert. Und alles ist besser, als Strings immer wieder zeichenweise zu untersuchen.

Dieser Post wurde am 24.11.2015 um 16:32 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.11.2015, 03:09 Uhr
Yadgar



Hi(gh)!


Zitat von ao:
Aber es lohnt sich wirklich, sich mal mit diesen Stream-Operatoren zu beschäftigen. Es ist eine eigene Denkweise, aber man kriegt sehr eleganten Code heraus, der auf Dateien, Konsolen-IO, Memory-Streams und dergleichen funktioniert. Und alles ist besser, als Strings immer wieder zeichenweise zu untersuchen.


Ich habe es versucht - und bin prompt dermaßen mit Fehlermeldungen vollgeknattert worden, dass ich es ganz schnell wieder sein gelassen habe! Nein, bis auf weiteres bleibe ich bei meinen selbstprogrammierten Funktionen...

Bis bald im Khyberspace!

Yadgar

(aber jetzt erst mal pennen, damit ich fit bin für die große Sushi-Orgie morgen Mittag!)
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: