Διαχωρισμός με την strtok

...ασύγχρονα μαθήματα γλώσσας C

Διαχωρισμός με την strtok

Δημοσίευσηαπό linuxs » 06 Ιούλ 2011, 19:07

Χρησιμοποιώ την strtok έτσι:
Κώδικας: Επιλογή όλων

pch = strtok(buf," ");
printf("pch: %s!!!!!", pch);

και έχω αυτό;
Κώδικας: Επιλογή όλων

pch: <html>
!!!!!penlix@PeN:~$


τι κάνω λάθος και τα !!!! μπαίνουν απο κάτω? :/ εγώ τα θέλω κολλητά...
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Διαχωρισμός με την strtok

Δημοσίευσηαπό migf1 » 06 Ιούλ 2011, 20:14

Πρέπει να δω ολόκληρο τον κώδικα για να βγάλω άκρη.

Η strtok() "σπάει" το 1ο όρισμά της σε μικρότερα κομμάτια που διαχωρίζονται από οποιονδήποτε χαρακτήρα περιέχεται μέσα στο 2ο όρισμά της. Επιστρέφει το 1ο από αυτά τα κομμάτια, οπότε για να τα μαζέψεις όλα πρέπει να την βάλεις μέσα σε ένα loop, όπου την ξανακαλείς αλλά με NULL πλέον το 1ο όρισμά της.

Ιδανικά θα πρέπει να χρησιμοποιήσεις κι έναν πίνακα από strings ώστε να "περισυλλέγεις" σε διαδοχικές θέσεις του πίνακα τα strings που σου επιστρέφει κάθε φορά η strok() καθώς "κομματιάζει" το αρχικό string σε κάθε επανάληψη του loop.

Καλό θα ήταν να το παλέψεις μόνος σου για να βρεις τι ακριβώς παίζει, αν όμως βαρεθείς ή οτιδήποτε άλλο, μπορείς να χρησιμοποιήσεις μια συνάρτηση που έχω φτιάξει ειδικά για αυτόν τον σκοπό, και την ονομάζω: s_tokenize().

Spoiler: show
Κώδικας: Επιλογή όλων

// ***********************************************************
// break a string up to maxtokens tokens and store them in *tokens[]
// (uses the chars in the delimeter string to separate tokens)
// returns the number of tokens, or 0 on failure
// ***********************************************************
int s_tokenize(char *s, char *tokens[], int maxtokens, char *delimiters)
{
register int i=0;

tokens[0] = strtok(s, delimiters);
if (tokens[0] == NULL)
return 0;
for (i=1; i < maxtokens && (tokens[i]=strtok(NULL, delimiters)) != NULL; i++);

return i;
}

Δέχεται ως ορίσματα:
α) το αρχικό string ( s )
β) τον πίνακα από strings για αποθήκευση των "κομματιών" του s ( *tokens[] )
γ) το μέγιστο πλήθος "κομματιών" στο οποίο θες να "κομματιαστεί" το αρχικό s ( maxtokens )
δ) το string που περιέχει τους διαχωριστικούς χαρακτήρες ( delimiters )

Η συνάρτηση σου επιστρέφει το πλήθος των κομματιών που προέκυψαν από το "κομμάτιασμα".

Είναι επίσης σημαντικό να σημειώσεις πως είτε με την strtok() είτε με s_tokenize() το αρχικό σου string "κομματιάζεται", οπότε αν για οποιονδήποτε λόγο το χρειάζεσαι ολόκληρο μετά την κλήση αυτών των συναρτήσεων, θα πρέπει πρώτα να φτιάξεις ένα αντίγραφό του (π.χ. με strncpy() ) και να περάσεις σε αυτές τις συναρτήσεις το αντίγραφο.
Τελευταία επεξεργασία από migf1 και 06 Ιούλ 2011, 20:42, έχει επεξεργασθεί 3 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Διαχωρισμός με την strtok

Δημοσίευσηαπό linuxs » 06 Ιούλ 2011, 20:30

Μάλιστα...θα προσπαθήσω να το κάνω μόνος μου αλλα πες μου κάτι,

έστω το string="<language> _____ "; πρόσεξε το κενό το τέλος(όπου _ βάλε " ")! για να πάρω μόνο το language χωρίς τα κενά πως θα πρέπει αν το χρησιμοποιήσω? :/

Έβαλα σαν διαχωριστικό το " " αλλα δεν το δέχεται πάλι εμφανίζει κενα...στο pc δεν έχω πρόσβαση τώρα(αύριο πάλι).
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Διαχωρισμός με την strtok

Δημοσίευσηαπό migf1 » 06 Ιούλ 2011, 20:35

linuxs έγραψε:Μάλιστα...θα προσπαθήσω να το κάνω μόνος μου αλλα πες μου κάτι,

έστω το string="<language> _____ "; πρόσεξε το κενό το τέλος(όπου _ βάλε " ")! για να πάρω μόνο το language χωρίς τα κενά πως θα πρέπει αν το χρησιμοποιήσω? :/

Έβαλα σαν διαχωριστικό το " " αλλα δεν το δέχεται πάλι εμφανίζει κενα...στο pc δεν έχω πρόσβαση τώρα(αύριο πάλι).

Θα βάλεις ως διαχωριστικούς χαρακτήρες στο 2ο όρισμα στο 1ο κάλεσμα της strtok (ή στο 4ο όρισμα της s_tokenize) τους χαρακτήρες: '<', '>' και ' '.

Δηλαδή: "<> "
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Διαχωρισμός με την strtok

Δημοσίευσηαπό linuxs » 07 Ιούλ 2011, 17:30

Όταν λέμε ώς διαχωριστικό χαρακτήρα το " " στον buf δεν θα υπάρχει έτσι? :/ Δηλαδή εάν έχομουμε " bill " και κάνουμε την strtok μόνο με το κενό θα πάρουμε μόνο "bill"?
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Διαχωρισμός με την strtok

Δημοσίευσηαπό migf1 » 07 Ιούλ 2011, 17:37

Ναι!
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση


Επιστροφή στο Μαθήματα C