Char array interpretieren

moin
ich lese aus ner Datei die Bytes als char array aus. Wenn ich da jetzt aber zB ne dreistellige Zahl drinne hab, lese ich ja jede Ziffer einzeln aus. Wenn ich aber diese Zahl als int haben will, muss ich mir die mühsam wieder zusammenbasteln? Da gibts doch sicher ne andere Möglichkeit oder?
Die Anzahl der Ziffern pro Zahl sind nicht immer gleich, es gibt aber immer Trennzeichen.

hi,
du suchst die Funktion atoi (heißt glaube ich ascii to integer).

Beispiel:
int value;
char str[10] = „-28“;
value = atoi (str);

Du kannst den String auch in double umwandeln: atof

hmm naja, bei nem char array hab ich ja jede ziffer einzeln… also quasi so:

Index: 01234567
Array: x56x458x

die einzelnen elemente wären also:
x (trennzeichen)
5
6
x
4
5
8
x

nun müsste ich ja mehrere Elemente des Arrays (hier, ab 0 gezählt, zB das 1. und 2. oder die Elemente 4-6) zu einer int Zahl 56 bzw 458 zusammenfügen… wir würde das gehen?

Die Funktion atoi macht das automatisch. Atoi guckt in einem String (Char Array) nach dem beginn der 1. Ziffer (auch Vorzeichen) und ließt bis zum Ende dieser Zahl im String diese Ziffern als int Zahl ein.

Probiere es aus.
strcpy (str, „123 zahl“);
zahl = atoi(str);
printf ("%d", str);

Ausgabe: 123

Du kannst dir natürlich auch die Funktion selber zusammenbasteln (habe ich mal gemacht:

  • String solange durchgehen, bis eine Ziffer oder ein Vorzeichen, gefolgt von einer Ziffer kommt
  • die Stelle merken und weiter gehen, bis keine Ziffer mehr kommt
  • dann von der hintersten (rechtesten) ziffer beginnen:
    zahl = str[8]*10^0 + str[7]*10^1 + str[6]*10^2 + usw.

jedes einzeln
Hallo Gibbel

nun müsste ich ja mehrere Elemente des Arrays (hier, ab 0 gezählt,
zB das 1. und 2. oder die Elemente 4-6) zu einer int Zahl
56 bzw 458 zusammenfügen… wir würde das gehen?

Mit einer Funktion, welche die einzelnen Zeichen abrattert, und wenn es eine Ziffer oder ein Minus ist, wird das an eine andere Funktion weitergeleitet:

const int BAD\_INT = 0xffff;

int getInt(char ch)
{
 static return\_ = 0;
 static int faktor = 1;
 static int positiv = 1;
 // wann die Werte zurueck setzen?

 if (! isdigit(ch) {return BAD\_INT;}
 else {return\_ += (ch - 48) \* faktor;
 faktor \*= 10;
 return return\_ \* positiv;
 }

 return BAD\_INT;
}

int auswerten(char\* text)
{
 int ret = 0;
 char ch;
 for (int i=0; ch = text[i]; i++)
 {
 if (isdigit(ch) || ch == '-') ret = getInt;
 }

 return 0;
}

So das waere einmal ein Anfang. Was noch fehlt, ist die Hausaufgabe bis zum naechsten Mal, :smile:
Was passiert, wenn ein Minus reinkommt? Sollte man irgendwie abfangen, nicht wahr?
Und das BAD_INT kann ja auch Rückgabewert von der getInt() sein.

Die atoi() ist übrigens noch so klein, die kann nur Strings wie „123“ oder „4561“; aber wenn du dann „a123“ umwandeln willst, oder "456 ", kriegt die gleich die Krise.

lG
Martin B

okay, danke ihr zwei! Das hat mir sehr geholfen :wink:

Hallo Gibbel,

noch was grundsätzliches: keiner der vorherigen Poster hat in Frage gestellt, warum du eigentlich die Datei zeichenweise einliest und durchparsen willst. Nur für den Fall, dass es dafür keinen Zwang gibt: es gibt Funktionen, die das Leben noch einfacher machen. Versuch es z.B. mal mit scanf(), oder falls C++ genehm ist, mit filestreams und dem >>-Operator.

Grüße,
Sebastian