gemischte Strings in char und int zerlegen

clarin

Grünschnabel
Hallo Zusammen,

ich suche nach einer Möglichkeit wie ich eine Stringvariable in ihre char- und
int-Bestandteile zerlegen kann.
Das mit dem char ist ja kein Problem, aber wie bekomme ich anstatt dem
ASCI-Wert einer Ziffer im String den richtigen (int) Wert.:confused:

Beispiel:
ich habe einen String strEingabe in den ich eine Zeichenfolge aus beliebigen
Zeichen und Ziffern einlese.
Nun will ich diesen String Zeichen für Zeichen durchlaufen und wenns dann
eine Ziffer ist soll die in einer int-Variablen gespeichert werden.

Wäre mir eine große Hilfe, wenn jemand eine Lösung parat hätte.:rolleyes:
 
die bibliotheksfunktion

atoi ( alphanumeric to integer )

sollte da hilfreich sein.

Funktioniert nach dem Muster:

atoi ( zeiger_auf_char_array )

------

das ganze gibt es auch noch als

atof -> alphanumeric to float
atol -> alphanumeric to long

atof ( zeiger_auf_char_array )
atol ( zeiger_auf_char_array )

-----

Für atoi, atof, atol muss die Datei "stdlib.h" per include eingebunden werden.

BSP:

Code:
char puffer [ 128 ];
int zahl;

cin.getline( puffer , 128 );

zahl := atoi( puffer );

cout << zahl << endl;
 
Danke für den Tip!
Das funktioniert zwar irgendwie schon, aber mein Problem ist, dass
ich einzelne Ziffern in int-Werte umwandeln will.
Wenn der String z.B.
Code:
string Text = "abc 123";
lautet, dann will ich wie folgt darauf zugreifen:
Code:
int Zahl;
for ( i=0; i<Text.size(); i++)
{
if ( isdigit(Text[i])
{
Zahl = Text[i];  // Nur hier das ganze mit einem Konstrukt,
  // Das mir den int-wert, also 1, 2 oder 3 in Zahl
  // speichert und nicht den ASCI-Wert
// hier wird dann eine Funktion aufgerufen die einen int-Wert erwartet
}
}
atoi erwartet einen Zeiger auf char. Den kann man zwar auf Text[i]
ansetzen, aber atoi schnappt sich gleich alle Zahlen die es dann finden kann.
Ich will aber nur eine!

Ich bin kurz vor dem Verzweifeln :( :confused:
 
Du musst erst alle zusammenhängenden Ziffern in einem temporären String sammeln und dann alles zusammen an atoi() übergeben. Übrigens könntest du auch std::istringstream zur Umwandlung verwenden.



Code:
// stringtest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <sstream>


int _tmain(int argc, _TCHAR* argv[])
{
  using namespace std;
  string Text = "wer123dasda345dasda567eqw";

  string strTemp; 
  int Zahl = 0;

  for ( string::size_type i=0; i<Text.size(); ++i )
  {
    if ( isdigit(Text[i]) )
    {
      strTemp += Text[i];
    }
    else
    {
      if ( strTemp.length() != 0 )
      {
        // bereits einige Ziffern gesammelt
        // Zahl = atoi( strTemp.c_str() );
        // oder:
        istringstream is;
        is.str( strTemp );
        is >> Zahl;
        cout << "Noch eine Zahl: " << Zahl << endl;
      
        //Noch den String leeren
        strTemp = "";
      }
    }
  }

  // war noch was im String?
  // (Das es nicht elegant ist, den Block noch einmal
  // zu wiederholen, weiss ich selbst. ;) )
  if ( strTemp.length() != 0 )
  {
    // bereits einige Ziffern gesammelt
    Zahl = atoi( strTemp.c_str() );
    // oder:
    istringstream is;
    is.str( strTemp );
    is >> Zahl;
    cout << "Noch eine Zahl: " << Zahl << endl;
  }

  getchar();
  return 0;
}
 
Zuletzt bearbeitet:
Wenn du nur einen char in einen int konvertieren willst:

char c_Wert=2;
int x=(int) c_Wert;

funktioniert auch bei allen anderen Variablentypen
 
Original geschrieben von Steiner_B
Wenn du nur einen char in einen int konvertieren willst:

char c_Wert=2;
int x=(int) c_Wert;

funktioniert auch bei allen anderen Variablentypen

Im Prinzip ja, aber das wollte der OP nicht. Wenn er Ziffern im String stehen hat, kann er die Zahlen so umwandeln:

char* szString = "Hurz 123";

int iZiffer = szString[5] - '0'; // die Eins umwandeln

Ich ziehe hier '0' von dem Char ab, um denn ASCII-Code von '1' (ist 49 dez.) in eine tatsächliche 1 umzuwandeln. Die Umrechnung aber wirklich nur für Ziffern anwenden!
 
Danke für eure Zahlreichen Antworten,
da war viel interessantes und Hilfreiches dabei.

Ich hab mich für die letzte Variante entschieden.
Einfach die '0' abziehen scheint mir für meinen Fall das einfachste zu sein.
Die Möglichkeit mit dem istringstream muss ich bei Gelegenheit auch mal testen.
Ihr habt mir sehr geholfen, Danke :)
 
Zurück