Strings Splitten / Teilen

Davicito

Erfahrenes Mitglied
Habt Ihr vielleicht eine Idee, ob es noch eine andere Möglichkeit gibt String aufzuteilen außer mit strtok()?
denn diese Funktion funktioniert bei mir nicht so richtig. Irgend welche Speicherprobleme bekomme ich beim Ausführen.

Java:
...
#define SIZE 255
...
char buffer[SIZE];
FILE* file;
char splitt[] = ",;.:!? ";
char* wort;
	
if(argc > 1 && (file = fopen(argv[1], "r")) != NULL)
{
	while(/*fgets(buffer, SIZE, file) != NULL &&*/ strtok(NULL, splitt) != NULL)
	{
		//printf("%s", buffer);
		wort = strtok(buffer, splitt);
		anhaengen(aktl_Elem, &buffer, copyString);  // einzelne Wörter werden in Liste aufgenommen
	}
	fclose(file);
}	
...

Gruß
 
Hallo,

soweit ich das übersehe, ist die Anwendung von strtok nicht richtig. Nur beim ersten Aufruf wird der zu splittende Buffer übergeben; bei allen weiteren Aufrufen immer nur Null:
C++:
wort = strtok(buffer, splitt);

while( wort != NULL )
{
    wort = strtok(NULL, splitt);
    // ...
}

Wann kommt eigentlich der String nach 'buffer'? Das kann ich in deinem Code nicht so erkennen. Es wäre auch mal interessant, die 'anhaengen'-Funktion zu sehen. Vermutlich müsstest du dort 'wort' übergeben und vermutlich auch ohne den Adressoperator (&).

Die andere Möglichkeit für Splitten wäre es, selber einen Algorithmus zu implementieren.

Gruß
MCoder
 
Wie gesagt, die Anwendung von strtok hat nicht gepasst.
C++:
#define SIZE 255

char buffer[SIZE];
FILE* file;
char splitt[] = ",;.:!? ";
char* wort;
    
if(argc > 1 && (file = fopen(argv[1], "r")) != NULL)
{
    while( fgets(buffer, SIZE, file) != NULL )
    {
        wort = strtok(buffer, splitt);
 
        while( wort != NULL )
        {
            anhaengen(aktl_Elem, wort, copyString);
            wort = strtok(NULL, splitt);
        }
    }
    
    fclose(file);
}
Gruß
MCoder
 
Hallo MCoder,

wenn ich das so mache, wie du mir oben gepostet hast, erhalte ich nichts schönes auf der Konsole:

Java:
izaguirre@ubuntu:~/C/Beleg_01$ gcc -o Liste Liste.c
izaguirre@ubuntu:~/C/Beleg_01$ ./Liste Test.txt
*** glibc detected *** ./Liste: malloc(): memory corruption: 0xb773a4f6 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x6b961)[0xb7647961]
/lib/i386-linux-gnu/libc.so.6(+0x6e15d)[0xb764a15d]
/lib/i386-linux-gnu/libc.so.6(__libc_malloc+0x63)[0xb764bf53]
./Liste[0x804862b]
./Liste[0x804888e]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0xb75f2e37]
./Liste[0x8048551]
======= Memory map: ========
08048000-08049000 r-xp 00000000 07:00 11479      /home/izaguirre/C/Beleg_01/Liste
08049000-0804a000 r--p 00000000 07:00 11479      /home/izaguirre/C/Beleg_01/Liste
0804a000-0804b000 rw-p 00001000 07:00 11479      /home/izaguirre/C/Beleg_01/Liste
09c3f000-09c60000 rw-p 00000000 00:00 0          [heap]
b7400000-b7421000 rw-p 00000000 00:00 0 
b7421000-b7500000 ---p 00000000 00:00 0 
b75bf000-b75d9000 r-xp 00000000 07:00 524130     /lib/i386-linux-gnu/libgcc_s.so.1
b75d9000-b75da000 r--p 00019000 07:00 524130     /lib/i386-linux-gnu/libgcc_s.so.1
b75da000-b75db000 rw-p 0001a000 07:00 524130     /lib/i386-linux-gnu/libgcc_s.so.1
b75db000-b75dc000 rw-p 00000000 00:00 0 
b75dc000-b7736000 r-xp 00000000 07:00 524102     /lib/i386-linux-gnu/libc-2.13.so
b7736000-b7737000 ---p 0015a000 07:00 524102     /lib/i386-linux-gnu/libc-2.13.so
b7737000-b7739000 r--p 0015a000 07:00 524102     /lib/i386-linux-gnu/libc-2.13.so
b7739000-b773a000 rw-p 0015c000 07:00 524102     /lib/i386-linux-gnu/libc-2.13.so
b773a000-b773d000 rw-p 00000000 00:00 0 
b774c000-b774e000 rw-p 00000000 00:00 0 
b774e000-b774f000 r-xp 00000000 00:00 0          [vdso]
b774f000-b776b000 r-xp 00000000 07:00 524089     /lib/i386-linux-gnu/ld-2.13.so
b776b000-b776c000 r--p 0001b000 07:00 524089     /lib/i386-linux-gnu/ld-2.13.so
b776c000-b776d000 rw-p 0001c000 07:00 524089     /lib/i386-linux-gnu/ld-2.13.so
bfbc5000-bfbe6000 rw-p 00000000 00:00 0          [stack]
Abgebrochen
izaguirre@ubuntu:~/C/Beleg_01$ ^C
izaguirre@ubuntu:~/C/Beleg_01$

Damit kann ich leider nichts anfangen. Hast Du vielleicht eine Ahnung, was das bedeutet?
Ich weiß das meine doppelt verkettete Liste funktioniert! Das wurde mit wörtern ausprobiert. Aber ich verstehe leider nicht, warum das mit einer txt-Datei nicht auch funktioniert.


Gruß, Davicito
 
Zuletzt bearbeitet:
Hallo,

zumimdest das Splitten von Strings funktioniert so:
C++:
int main()
{
    char buffer[] = "TEXT1,TEXT2,TEXT3,TEXT4,TEXT5";
    char splitt[] = ",;.:!? ";
    char* wort;
    
    wort = strtok(buffer, splitt);
 
    while( wort != NULL )
    {
        printf("%s\n", wort);
        wort = strtok(NULL, splitt);
    }
    
    return 0;
}
Wo es in deinem Projekt sonst noch kracht, übersehe ich nicht.

Gruß
MCoder
 
OK... Ich habe noch selber einen Fehler eingebaut gehabt. das fclose(file) stant noch hinter der inneren while-Schleife und hab das jetzt noch wie Du nach der Äußeren-Schleife angehängt.

Jetzt funktioniert alles bestens ^^.

Aber hast Du vielleicht noch ne Idee, wie ich die Leerzeilen raus bekomme?

Test.txt
Java:
Sehr geehrte Damen und Herren,

hier erfand der Erfinder Konstantin ein mobilen Stuhl, den man Ausklappen konnte.
Hier mal die Veranschaulichung->zum Thema_ Klapp_Stuhl oder Klapp.stuhl

Viel Spaß damit, wünsch ich Euch!

Ergebnisbild auf der Konsole
Java:
izaguirre@ubuntu:~/C/Beleg_01$ gcc -o Liste Liste.c
izaguirre@ubuntu:~/C/Beleg_01$ ./Liste Test.txt
Sehr
geehrte
Damen
und
Herren




hier
erfand
der
Erfinder
Konstantin
ein
mobilen
Stuhl
den
man
Ausklappen
konnte


Hier
mal
die
Veranschauli
zum
Thema_
Klapp_Stuhl
oder
Klapp
stuhl



Viel
Spaß
damit
wünsch
ich
Euch


Speicherzugriffsfehler
izaguirre@ubuntu:~/C/Beleg_01$

Vielen Dank MC.
 
Zuletzt bearbeitet:
Hi deepthroat,
damit habe ich lieder keine Ahnung im Umgang. Als ich das mal so naiv in die Konsole eingehackt habe, stant da nur [No Source Available]:

Java:
 ????????????????????????????????????????????????????????????????????????????
   ?                                                                          ?
   ?                                                                          ?
   ?                                                                          ?
   ?                                                                          ?
   ?                                                                          ?
   ?                                                                          ?
   ?             [ No Source Available ]                                      ?
   ?                                                                          ?
   ?                                                                          ?
   ?                                                                          ?
   ?                                                                          ?
   ?                                                                          ?
   ?                                                                          ?
   ????????????????????????????????????????????????????????????????????????????
child process 2143 In: __kernel_vsyscall             Line: ****   PC: 0xb7fe1424 
aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
 
Zurück