Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » FAQ C / C++ (ANSI-Standard) » zahlen string in integer umwandeln

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
19.05.2003, 14:31 Uhr
~karlnapf
Gast


hallo ...
ja, wie eght das was da im betreff steht.....sorry für die blöde frage bin neu :)
danke

karlnapf
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.05.2003, 14:43 Uhr
~arkantos
Gast


Versuchs mal mit


C++:
int=atoi(char *),


grüße arkantos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.05.2003, 15:09 Uhr
virtual
Sexiest Bit alive
(Operator)


Hm, habe noch nix in der FAQ dazugefunden, daher mal ein Vorschlag: bitte Kommentare + Verbesserungsvorschläge oder Alternativen:

Umwandeln Text -> Zahl

1. Möglichkeit - sscanf (ANSI C)

C++:
#include <stdio.h>

int main()
{
   char* text = "4711";
   int zahl;
   int ret;

   ret = sscanf(text, "%d", &zahl);

   if (ret != 1)
   {
     /* Fehler */
   }
   ...
}


Bei sscanf wird als erstes Argument der Text übergeben, das zweite Argument enthält eine Formatangabe, mit der sscanf erkennt, in was denn der Text umgewandelt werden soll ("%d" bedeutet soviel wie int). Die folgenen Argument geben an, wohin das Resultat geschrieben werden soll. Dabei wird die Adresse der Variablen angegeben.
sscanf ist auch in der Lage mehrere Dinge auf einmal umzuwandeln:

C++:
int i;
char[20] s;
double d;
sscanf(text, "%d - %s - %g", &i, s, &d);


Hier werden ein Integer, ein String und ein Double eingelesen, jeweils durch " - " getrennt. Ein vollständige Beschreibung der Möglichkewiten von sscanf würde den Rahmen des Artikels hier sprengen, daher soll es hier zunächst mal dabei belassen werden.
Ein wichtiger Aspekt ist jedoch der Rückgabewert von sscanf: Er gibt an, wie viele Dinge von sscanf korrekt eingelesen wurden. Im obigen Beispiel könnte man als ret abfragen und wenn dieses 0 ist, dann war das einlesen nicht erfolgreich.

2. Möglichkeit - atoi (ANSI C)

C++:
#include <stdlib.h>

int main()
{
   char* text = "4711";
   int zahl;

   zahl = atoi(text);
   ...
}


Diese Funktion erwartet als Argument den Text und gibt die zahl zurück. Diese Funktion ist jedoch icht in der lage, einen Fehlercoede zurückzuliefern. Wenn also in text Müll steht, dann auch in zahl und keiner merkt was.

3. Möglichkeit - strtoul (ANSI C)

C++:
#include <stdlib.h>

int main()
{
    char* text = "4711";
    unsigned long zahl;
    char* err;

    zahl = strtoul(text, &err, 10);

    if (*err != 0)
    {
       /* Fehler */
    }
    ...
}


Diese Routine fällt etwas aus dem Rahmen, weil sie als Ergebnis ein unsigned long und kein int liefert. Sie erwartet als erste Argument den zu analysierenden Text. Im zweiten Argument wird ein Zeiger auf ein char* mitgeliefert, welches von strtoul auf das zeichen gesetzt wird, bis zu dem erfolgreich der Text analysiert wurde. Dh insbesondere in Obigen Beispiel: wenn err auf das terminierende Null byte von text zeigt, wurde der String korrekt eingelesen, sonst zeigt err auf das erste fehlerhafte Zeichen. Das letzte Argument gibt die Basis an, in der die Zahl in text gespeichert ist. hier ist jeder Wert zwischen 2 und 36 erlaubt, wobei 10 unser geliebtes Dezimalsystem ist). Als Rückgabe kommt die Zahl raus.

4. Möglichkeit - stringstream (ANSI C++)

C++:
#include <sstream>

int main()
{
    char* text = "4711;
    int zahl;

    std::stringstream s(text);
    s>>zahl;

    if(!s)
    {
        /* Fehler */
    }
    ...
}


Der Weg in der reinen C++ Lehre ist die Verwendung von String Streams. Man konstruiert zunächst einen StringStream mit dem gewünschten text und gibt dann den Inhalt in die Variablen aus, wohin wir sie wollen. Die Konvertoierung geht implizit. Der StreamStatus wird auf failed gesetzt, wenn was schief ging und dies kann man mit dem Operator ! abfragen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 19.05.2003 um 15:10 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.05.2003, 20:08 Uhr
~karlnapf
Gast


ok danke ....
hihi ..hab da nur leider was verpeilt ....wollte das genaue gegenteil wissen
also ich hab ne zahl die ich in ein object der string klasse kopieren will :)
...ein beipsiel wie oben wäre nett ..reciht mir sogar wenns nur OOP ist
danke für die hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.05.2003, 20:43 Uhr
virtual
Sexiest Bit alive
(Operator)


lol.

C++:
std::stringstream s;
s << 4711;
// nun ist s.str() die zahl in Stringrepräsentation.


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.05.2003, 21:06 Uhr
~karlnapf
Gast


danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.05.2003, 22:12 Uhr
Hans
Library Walker
(Operator)



Zitat:
virtual postete
Hm, habe noch nix in der FAQ dazugefunden, daher mal ein Vorschlag: bitte Kommentare + Verbesserungsvorschläge oder Alternativen:

Umwandeln Text -> Zahl



5. Variante:
(Zwar nicht unbedingt portabel, aber das kann man noch ändern. Und vor allem: Es zeigt wie's grundsätzlich geht, und ist für beliebige Zahlensysteme zu gebrauchen.

C++:
/* Datei: zahlein.c

   Programm zum testen einer Routine zur Zahleneingabe

   V 1.0 by HGP
*/


#include <stdio.h>

double zahlein(char *s);

main()
{
  double zahl;
  char s[20];

  printf ("Bitte geben Sie eine Zahl ein: ");
  fgets (s, 19, stdin);
  zahl=zahlein(s);
  printf ("Die eingegebene Zahl ist: %d\n", zahl);

  return 0;
}


double zahlein(char *s)
{
  int i, vz, m, base;
  int vk;
  double nk, w;

  i=vz=vk=0;
  w=nk=0.;

  if (s[i] == '\0' || s[i]=='\n')
     return 0.;
  // evtl. vorhandene Buchstaben in Kleinbuchstaben umwandeln
  for ( ; s[i] != '\0'; i++)
      s[i] = tolower(s[i]);
  i=0;
  while (s[i] == ' ')    // Führende Leerzeichen überlesen
        i++;

  // Zahlenbasis ermitteln
  base = 10;    // Dezimalzahlen = defaulfteinstellung
  if (s[i] == '%') base = 2;
  if (s[i] == '$') base = 16;

  // Vorzeichen ermitteln
  if (s[i]=='-')    // Negatives Vorzeichen
    { vz=1;            // zur Kenntniss nehmen
      i++;          // und zum nächsten Zeichen
    }
  if (s[i]=='+')    // Positives Vorzeichen
     i++;            // überlesen, da Defaulteinstellung

  if (s[i]=='.' || s[i]==',')    // Komma überlesen
    { i++;
      goto nachkomma;
    }

  /* Vorkommastellen einlesen */
  while (  s[i]>'/' && s[i]<':' )
      { m = (s[i]-'0');
        if (base == 16)
           if (m>9) m-=7;
        vk = vk * base + m;
        i++;
      } /* while schleife */

  if (s[i]=='.' || s[i]==',') /* Komma oder Dezimalpunkt überlesen */
      i++;
  nachkomma:
      /* Nachkommastellen einlesen */
      while (  s[i]>'/' && s[i]<':' )
      { m = (s[i]-'0');
        if (base == 16)
           if (m>9) m-=7;
        nk = nk / (double)base + (double)m;
        i++;
      } /* while schleife */

  w=(double)vk + nk;
  return (vz ? -w : w);
}

/* Ausschnitt aus der ASCII-Tabelle:
   Zeichen     :  /  0  1  2  3  4  5  6  7  8  9  :
   Code  (dez) :  47 48 49 50 51 52 53 54 55 56 57 58
     (hex) :  2f 30 31 32 33 34 35 36 37 38 39 3a
*/


/*
int numinput(char *text, int vorgabe)
{
  char s[10];
  int i, m, base;
  int w,
      x, y;

  printf ("%s", text);
  x = wherex(); y = wherey();
  fgets (s, 5, stdin);
  gotoxy (x,y);
  if (s[0] == '\0' || s[0]=='\n')
    {
      w = vorgabe;
      printf ("%d", vorgabe);
    }
  else
    {
      i=0; w=0;

      base = 10;
      if (s[0] == '%') base = 2;
      if (s[0] == '$') base = 16;

      i=1;
      while (i<10)
      { s[i] = tolower (s[i]);
        i++;
      }
      if (base == 10) i=0;
      else i=1;
      while (  s[i]>'/' && s[i]<':' || s[i]>'@' && s[i]<'g' )
      { m = (s[i]-'0');
        if (base == 16)
           if (m>9)  m-=7;
        w = w * base + m;
        i++;
      } /* while schleife */

    } /* else-zweig */
  return w;
}
  */



Ne genaue Erklärung werde ich noch nachliefern.

Hans

(Naja, - das kommt davon, wenn man weis, das man so 'ne Routine auch irgendwo auf der Platte hat, und dann einfach per copy & paste ins Forum schickt... - da ist ja doch noch einiges dran zu tun, wie ich gerade sehe. )
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 19.05.2003 um 22:18 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.05.2003, 22:47 Uhr
virtual
Sexiest Bit alive
(Operator)


@Hans
Hm, was mir nicht ganz gefältt ist vor allem die Tatsache, daß der String verändert wird.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.05.2003, 23:17 Uhr
~karlnapf
Gast


oh mann, wollte doch nur einen integer umwandeln
aber dafür finde ich bestimmt acuh noch verwendung
danke für die hilfe an alle

karlnapf
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.05.2003, 12:12 Uhr
~bloeb
Gast


wuerde ned auch einfach sprintf gehen?
string buffer;
sprintf( buffer, "%d", zahl );

oder unterstuetzt das der string ned? wuerde buffer.c_str() nen unterschied machn?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ FAQ 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: