Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 28 Μαρ 2012, 15:09

migf1 έγραψε:Αυτό το κάνει για σένα η strtok(), την οποία και θα είναι καλό να χρησιμοποιήσεις (αλλιώς θα παιδευτείς πολύ, χωρίς να υπάρχει λόγος).

Μα αν είναι να χρησιμοποιήσω την strok() δεν καταλαβαίνω το νόημα της άσκησης.
Απλά να αποθηκεύσω τα string που επιστρέφει η strok σε μια array;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 28 Μαρ 2012, 15:16

Ilias95 έγραψε:
migf1 έγραψε:Αυτό το κάνει για σένα η strtok(), την οποία και θα είναι καλό να χρησιμοποιήσεις (αλλιώς θα παιδευτείς πολύ, χωρίς να υπάρχει λόγος).

Μα αν είναι να χρησιμοποιήσω την strok() δεν καταλαβαίνω το νόημα της άσκησης.
Απλά να αποθηκεύσω τα string που επιστρέφει η strok σε μια array;

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

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 28 Μαρ 2012, 15:19

Π.χ. πως θα διαχειριστείς το θέμα του πλήθους των tokens; Για παράδειγμα, τι θα γίνεται αν το original string βγάζει περισσότερα tokens από ότι έχει ορίσει ο προγραμματιστής ως όριο στον πίνακα από strings του;
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 28 Μαρ 2012, 16:35

Το έκανα (λίγο βιαστικά) και το έβαλα να δουλεύει με το sample code που παραθέτεις στο site σου:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <string.h>

#define MAXTOKENS 50

int s_tokenize(char *s, char *tokens[], const int ntoks, const char *delims)
{
int i = 1;

tokens[0] = strtok(s, delims);
for (i = 1; i < ntoks; i++) {
tokens[i] = strtok(NULL, " ,.-");
if (! tokens[i])
break;
}

return i;
}

int main( void )
{
char s[] = "lots of character to play with";
char *tokens[ MAXTOKENS ] = { NULL };
int ntokens = 0;
register int i = 0;

ntokens = s_tokenize( s, tokens, MAXTOKENS, " " );

if ( ntokens > 0 )
for (i=0; i < ntokens; i++)
puts( tokens[i] );

return 0;
}

Για δες αν είναι οκ. Φρόντισα και γι' αυτό που λες στο παραπάνω post.

PS. Ο κώδικας επιδέχεται μικρές βελτιώσεις. Ο έλεγχος που κάνω μέσα στο loop ίσως μπορεί να μεταφερθεί στο σώμα του loop. Θα τα δω αργότερα.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 28 Μαρ 2012, 16:41

Οκ, θα το κοιτάξω κι εγώ λίγο αργότερα (γιατί τώρα γράφω & σελιδοποιώ τα help-screens του HexViewer... πολύ σπάσιμο ρε γαμότο και τα helps και τα comments :lol:).

Παρεμπιπτόντως ο κώδικας στο site μου είναι λάθος (το παράδειγμα εννοώ)... συγκεκριμένα το...

Μορφοποιημένος Κώδικας: Επιλογή όλων
char *tokens[ MAXTOKENS ] = { NULL };

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

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 28 Μαρ 2012, 16:43

giannefor για κουτσομπολιο μπηκες παλι εδω μεσα? :lol: :lol: τι κοιτας....
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 28 Μαρ 2012, 16:45

migf1 έγραψε:δεν ορίζει MAXTOKENS tokens, αλλά πίνακα απροσδιόριστου πλήθους tokens, με το καθένα τους να έχει μέγιστο μήκος MAXTOKENS

Δεν νομίζω ότι ισχύει αυτό.
Δοκίμασε να ορίσεις το MAXTOKENS σε 2. Θα δεις ότι θα εκτυπωθεί κανονικά το string "lots" το οποίο προφανώς και έχει περισσότερους από 2 χαρακτήρες.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 28 Μαρ 2012, 16:45

Από μια πρόχειρη ματιά που έριξα τώρα στον κώδικά σου Ηλία (1η ανάγνωση) πρέπει να έχει πρόβλημα. Αφενός τι σου επιστρέφει αν δεν υπάρχει κανένας delimiter μέσα στο s, κι αφετέρου τι κάνει αν για delimiters του δώσεις π.χ. "abcd";
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 28 Μαρ 2012, 16:47

Ilias95 έγραψε:
migf1 έγραψε:δεν ορίζει MAXTOKENS tokens, αλλά πίνακα απροσδιόριστου πλήθους tokens, με το καθένα τους να έχει μέγιστο μήκος MAXTOKENS

Δεν νομίζω ότι ισχύει αυτό.
Δοκίμασε να ορίσεις το MAXTOKENS σε 2. Θα δεις ότι θα εκτυπωθεί κανονικά το string "lots" το οποίο προφανώς και έχει περισσότερους από 2 χαρακτήρες.

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

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 28 Μαρ 2012, 16:48

migf1 έγραψε:Από μια πρόχειρη ματιά που έριξα τώρα στον κώδικά σου Ηλία (1η ανάγνωση) πρέπει να έχει πρόβλημα. Αφενός τι σου επιστρέφει αν δεν υπάρχει κανένας delimiter μέσα στο s, κι αφετέρου τι κάνει αν για delimiters του δώσεις π.χ. "abcd";

Επίσης αν περάσεις κενό string για "σπάσιμο" πετάει seg fault. Θα το δω το απογευματάκι γιατί τώρα δεν προλαβαίνω.
Με good input πρέπει να δουλεύει σωστά πάντως.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι

cron