Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

c++ Pointerproblem

Diskussion: c++ Pointerproblem im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hallo, mittels folgender Funktion lasse ich mir eine Zeichenkette einlesen: Code: void parseSetOfIntegers(const char* listAsString, int* list) { int ...

Antwort
Alt 27.05.11, 22:36   #1 (permalink)
 
Registriert seit: 13.04.07
tanj Leistung: Facit NTK
Likes: 0
Standard c++ Pointerproblem

Anzeige

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[i] berechnen und dementsprechend dann den Pointer erhoehen, oder gibt es bessere Loesungen?

Gruss

tanj
tanj ist offline   Mit Zitat antworten
Alt 28.05.11, 01:10   #2 (permalink)
Senior Member
 
Benutzerbild von lookshe
 
Registriert seit: 10.03.07
lookshe Leistung: 8086
Likes: 19
Standard

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.
lookshe ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 28.05.11, 01:40   #3 (permalink)
 
Registriert seit: 06.06.09
Thunderb0lt Leistung: 8086
Likes: 6
Standard

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.
__________________
A good programmer looks both ways before crossing a one-way street.

Die Politik kann uns nur für so dumm verkaufen, wie wir sind.
Thunderb0lt ist offline   Mit Zitat antworten
Alt 28.05.11, 10:11   #4 (permalink)
 
Benutzerbild von benediktibk
 
Registriert seit: 03.05.07
benediktibk Leistung: 8086benediktibk Leistung: 8086
Likes: 50
Standard

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
benediktibk ist offline   Mit Zitat antworten
Alt 28.05.11, 13:41   #5 (permalink)
Senior Member
 
Benutzerbild von lookshe
 
Registriert seit: 10.03.07
lookshe Leistung: 8086
Likes: 19
Standard

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...
lookshe ist offline   Mit Zitat antworten
Alt 28.05.11, 20:20   #6 (permalink)
Senior Member
 
Registriert seit: 13.07.08
enkore Leistung: K 6-3enkore Leistung: K 6-3enkore Leistung: K 6-3
Likes: 85
Standard

Du kannst auch einfach Boost.Tokenizer benutzen
__________________
"It is the human race! The deterioration of the spirit of man. Man undermining himself, causing a self-willed, self-imposed, self-evident self-destruction."
+++ BREAKING +++ Troll ertrinkt im Planschbecken +++
enkore ist offline   Mit Zitat antworten
Alt 29.05.11, 17:21   #7 (permalink)
 
Benutzerbild von mauralix
 
Registriert seit: 17.04.06
mauralix Leistung: 8086
Likes: 3
Standard

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.
mauralix ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » c++ Pointerproblem
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61