| Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme. |
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 ...
![]() |
| | #1 (permalink) |
| Registriert seit: 13.04.07 ![]() Likes: 0 | 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++;
}
}
}
} 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 |
| | |
| | #2 (permalink) |
| Senior Member Registriert seit: 10.03.07 ![]() Likes: 19 | 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. |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) |
| Registriert seit: 06.06.09 ![]() Likes: 6 | 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. |
| | |
| | #4 (permalink) |
| Registriert seit: 03.05.07 ![]() ![]() Likes: 50 | 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 |
| | |
| | #5 (permalink) |
| Senior Member Registriert seit: 10.03.07 ![]() Likes: 19 | 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... |
| | |
| | #6 (permalink) |
| Senior Member Registriert seit: 13.07.08 ![]() ![]() ![]() Likes: 85 | 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 +++ |
| | |
| | #7 (permalink) |
| Registriert seit: 17.04.06 ![]() Likes: 3 | 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.
__________________ http://chm0815.blogspot.com |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |