Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Char Array (An C Programmierer unter euch)

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
06.10.2009, 15:24 Uhr
feran



Hallo.

Ich programmiere zwar in C++, aber die folgende Problemstellung möchte ich ausschließlich mit C - Methoden und Datentypen realisieren (bitte fragt mich nicht warum ich weiß es auch nicht ).
Ich habe mich shon etwas in C-String- funktionen belesen, aber trotzem noch keinen Lösungsansatz gefunden.

Ich habe eine char Array Zeichenkette,

z.B:

char input[128]="ABCDEFG,HIJKLMN,OPQRSTU,VWXYZ:123456789:112545643:5546385:7463574"

die besteht sowohl aus Zahlen als auch aus den Wörtern, das spielt aber jetzt noch keine Rolle.
Was ich möchte ist, meine Zeichenkette in mehrere Zeichenketten zu zerlegen. Die Kommas und Doppelpunkte sollen als \0 übersetzt werden, damit sie als Trennzeichen dienen, und damit ich weiter mit den einzelnen Bestandteilen arbeiten kann.

Ich habe da mal folgendes versucht


Code:
          // meine Zeichenkette
          char input[128]="ABCDEFG,HIJKLMN,OPQRSTU,VWXYZ:12789:11253:55485:7463574";


          // k=-1; damit k in der for-Schleife bei 0 anfängt
          int i, k=-1;
          //Zeiger Array auf die einzelnen durch , und : getrennte Elemente
          //aber ersteinmal nur durch Komma getrennt
          char* zeiger[10];
          
          for(i=0; i< strlen(input); i++)
          {
            if(input[i]==',')
            input[i]='\0';

         zeiger[k++] = &input[i+1];

         cout<<zeiger[0];



Das sollte meiner Meinung nach eigentlich prima funktionieren, tut es aber nicht, Die Ausgabe gibt in diesem Fall die ersten beiden Zeichen nicht aus, bei cout<<zeiger[1]; gibt er dasselbe aus. Ich weiss nicht weiter
Ich möchte es nochmal sagen, ich will meine Zeichenkette nicht als cstring, und nicht als string haben, sondern als char [] haben.
Wäre sehr dankbar wenn mir jemand helfen könnte.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.10.2009, 16:07 Uhr
ao

(Operator)


www.cppreference.com/wiki/c/string/strtok
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.10.2009, 16:49 Uhr
0xdeadbeef
Gott
(Operator)


Der Fehler in deinem Code ist, dass nach dem Einfügen eines sentinels strlen(input) nicht mehr das selbe ist wie vorher. Allerdings hat ao recht, für solche Dinge gibt es strtok.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.10.2009, 10:12 Uhr
~feran
Gast



Zitat:
Der Fehler in deinem Code ist, dass nach dem Einfügen eines sentinels strlen(input) nicht mehr das selbe ist wie vorher


Tut mir Leid, verstehe das nicht so ganz, bin (leider immernoch) Anfänger


Das mit strtok ist schwierig. Einerseits komme ich mit dieser Funktion nicht besonders zurecht.
Im oberen Beispiel z.B. liefert strok einen Zeiger auf die Zeichenkette, ich bräuchte aber 8 davon.

Außerdem hat man mir ausdrücklich vor dieser Funktion abgeraten, weil man damit angeblich früher oder später böse Probleme bekommen kann, weil (wenn ich das richtig verstehe) strtok die Werte im Stack speichert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.10.2009, 19:07 Uhr
Tommix



Hallo,
gemein ist, daß '\0' bedeutet "der String ist zu Ende" und strlen nach dem Einfügen logischerweise einen kleineren Wert zurückgibt als vorher. Du mußt den Anfangswert speichern.
- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.10.2009, 19:52 Uhr
0xdeadbeef
Gott
(Operator)


Nein, strtok verändert lediglich den String, den man ihr gibt, und merkt sich intern die letzte Position. Des letzteren wegen ist strtok nicht threadsicher und sollte auf Systemen, die POSIX.1-2001 unterstützen, durch strtok_r ersetzt werden.

Das sieht dann etwa so aus:

C++:
char input[]
  = "ABCDEFG,HIJKLMN,OPQRSTU,VWXYZ:12789:11253:55485:7463574";
char *saveptr;
char *zeiger[10];
size_t i;

for(i = 1,    zeiger[0] = strtok_r(input, ",:", &saveptr);
    i < 10 && zeiger[i] = strtok_r(NULL , ",:", &saveptr);
    ++i);


bzw. mit strtok (weniger empfehlenswert)

C++:
char input[]
  = "ABCDEFG,HIJKLMN,OPQRSTU,VWXYZ:12789:11253:55485:7463574";
char *zeiger[10];
size_t i;

for(i = 1,    zeiger[0] = strtok(input, ",:");
    i < 10 && zeiger[i] = strtok(NULL , ",:");
    ++i);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 07.10.2009 um 19:52 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.10.2009, 13:00 Uhr
~feran
Gast


ok. Vielen Dank, ich probiere es aus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: