c++ Pointerproblem

tanj

New member
Hallo,

mittels folgender Funktion lasse ich mir eine Zeichenkette einlesen:
Code:
void parseSetOfIntegers(const char* listAsString, int* list)
{
    int i = 0;
    const char* p = listAsString;

    if (*p == 123)
    {
        while (*p)
        {   p++;
            if (*p >=48 && *p <= 57)
            {
                list[i] = atoi(p);
                i++;
            }
        }
    }
}

Die Zeichenkette soll die Form {X,XX,X} haben, fuer X nur ganze Zahlen. Das funktioniert auch wunderbar fuer X<10. Fuer X>=10 tritt das Problem auf, dass zwar, z.B. fuer {123, 6, 8} die einstelligen Zahlen normal eingelesen werden. Fuer die 123 aber passiert folgendes: In list[0] steht 123, in list[1] 23 und in list[2] 3.

Ich kann mir denken, dass es daran liegt, dass atoi alle Zeichen in einen Integer umwandelt die ab Adresse p stehen, fuer alle Zeichen, fuer die das moeglich ist. Es beginnt also bei Adresse von 1, ist kein Problem, also weiter 2 und 3 ist auch kein Thema und dann steht da ein Komma in Ascii und es bricht ab. In list[0] wird also 123 geschrieben. Es wird anschliessend der Pointer um eins erhoeht und wir starten bei 2, dass gleiche Spiel von vorn.

Muss ich als Loesung die Stelligkeit jeder einzelnen Zahl in list berechnen und dementsprechend dann den Pointer erhoehen, oder gibt es bessere Loesungen?

Gruss

tanj
 

lookshe

Member of Honour
Schau dir mal strtok an. Damit kommst du quasi an die einzelnen Zahlen (nicht Ziffern) und kannst diese mit atoi weiterverarbeiten.
Allerdings sollte man mit diesem Befehl vorsichtig sein, unter bestimmten Umständen, macht der ganz schön Murks im Speicher und man bekommt beim allozieren immer die selbe Speicheradresse. Tritt nicht auf, sofern man die Tokens in ein und der selben Variable zwischenspeichert.
 
G

Gelöschtes Mitglied 16444

Guest
Eine andere - und wie ich finde einfachere - Variante wäre sscanf.
Oder, wenn du in C++ bist, brauchst du dich mit dem ganzen C Kram nicht herumschlagen und nimmst direkt streams.
 

benediktibk

Standardgruppe für nicht aktivierte User
Oder (ich finde die oberen Lösungen aber schöner, nur der Vollständigkeit halber) du durchsuchst vor dem Parsen den String nach Kommata und merkst dir deren Positionen.

mfg benediktibk
 

lookshe

Member of Honour
Das wäre aber auch nur ein neues strtok, denn das arbeitet im Prinzip so.

Wenn die Zeichenfolge immer in der Form {X,X,X} ist, dann wäre sscanf natürlich eine Alternative, hab ich nicht genau genug gelesen...
 

mauralix

New member
Wenn man sich noch keine Splitfunktion geschrieben hat kann man einfach mit strstr() in einer Loop das nächste "," suchen und dieses durch '\0' ersetzen und dann einfach atoi() anwenden.
 
Oben