Timonkaipumpa Δημοσ. 24 Οκτωβρίου 2011 Δημοσ. 24 Οκτωβρίου 2011 Ωραία οσον αφορά πίνακες μορφής int... Τι γίνεται όμως όταν θέλω να αποθηκεύσω Ν αριθμό strings, (μεταβλητού μεγέθους), όπου το Ν και κάθε string ορίζεται από το χρήστη; > typedef struct { uint32 length; char* theString[]; }myString; myString* arrayOfStrings; Όπου uint32 είναι ένας μη προσημασμένος ακέραιος 32 bit. Βάλε το ανάλογο με το σύστημά σου. edit Το από πάνω χρησιμοποιείται ως: > myString* pOneString; pOneString = (myString*) malloc( sizeof( uint32 ) + ( sizeof( char ) * theLength) ); pOneString->length = theLength; κτλ.
παπι Δημοσ. 24 Οκτωβρίου 2011 Δημοσ. 24 Οκτωβρίου 2011 Τι ειναι τουτο ρε τιμο; 1) char **strs με τερματισμο το NULL 2) char *strs με διαχωρισμο το \0 και τερματισμο το \0\0
migf1 Δημοσ. 24 Οκτωβρίου 2011 Δημοσ. 24 Οκτωβρίου 2011 (επεξεργασμένο) Ωραία οσον αφορά πίνακες μορφής int... Τι γίνεται όμως όταν θέλω να αποθηκεύσω Ν αριθμό strings, (μεταβλητού μεγέθους), όπου το Ν και κάθε string ορίζεται από το χρήστη; Ή θα χρησιμοποιήσεις κάποια εξωτερικό string API, ή θα φτιάξεις κατάλληλες δομές και συναρτήσεις μόνος σου. Μια τέτοια δομή σου υπέδειξε ήδη ο timonkaipumpa. Τα αποσπάσματα κώδικα που παραθέτω παρακάτω είναι από ένα string API που έφτιαχνα, αλλά το σταμάτησα στη μέση γιατί γινόταν αρκετά περίπλοκο (αποφάσισα να φτιάξω μια πιο απλή βιβλιοθήκη διαχείρισης συμβολοσειρών, που την φτιάχνω ακόμα). Όπως και να έχει, τα παρακάτω αποσπάσματα δεν είναι περίπλοκα, για αυτό και τα παραθέτω: > #define FREE( p ) \ do { \ if ( (p) ) { \ free( (p) ); \ (p) = NULL; \ } \ } while( 0 ) typedef char EStrChar; typedef long int EStrSize; typedef unsigned long EStrAddress; typedef struct estr { /* our basic EStr structure */ EStrSize length, size; EStrChar *text; } EStr; /* ------------------------------------------------------------------------------------ * Δημιουργεί κι επιστρέφει ένα νέο estring από το κείμενο text. * Επιστρέφει NULL σε περίπτωση σφάλματος. * * Παράδειγμα Χρήσης: * --------------------------- * EStr *string = estr_unmanaged_new("hello world"); * ... * estr_unmanaged_destroy( string ); * * ------------------------------------------------------------------------------------ */ EStr *estr_unmanaged_new( const char *text ) { EStr *estr = calloc( 1, sizeof( EStr ) ); if ( !estr ) return NULL; if ( !text ) { FREE( estr ); return NULL; } estr->length = strlen( text ); estr->size = estr->length + 1; estr->text = calloc( estr->size, sizeof( EStrChar) ); if ( !estr->text ) { FREE( estr ); return NULL; } memcpy( estr->text, text, estr->size * sizeof(EStrChar) ); return estr; } /* ------------------------------------------------------------------------------------ * void estr_unmanaged_destroy( EStr *estr ) * release memory allocated to ESring estr * ------------------------------------------------------------------------------------ */ void estr_unmanaged_destroy( EStr *estr ) { if ( !estr ) return; FREE( estr->text ); FREE( estr ); return; } Με αυτόν τον κώδικα της estr_unmanaged_new() μπορείς να δημιουργείς και να διαβάζεις strings από κείμενα αγνώστου μήκους, που τα περνάς ως παράμετρο. Επειδή είναι unmanaged όμως, το καθένα από αυτά τα strings θα πρέπει στο τέλος του προγράμματος σου να το απελευθερώσεις με την estr_unmanaged_destroy() ... το API είναι κυρίως managed, αλλά δεν είναι επί του παρόντος. Οπότε μπορείς εύκολα τώρα να φτιάξεις έναν δυναμικό πίνακα από estrings στο πλήθος στοιχείων που θα σου δώσει ο χρήστης. Π.χ σε C99... > ... int n; scanf( "%d", &n); EStr estrtable[ n ]; ... Επεξ/σία 31 Οκτωβρίου 2011 από migf1
Timonkaipumpa Δημοσ. 24 Οκτωβρίου 2011 Δημοσ. 24 Οκτωβρίου 2011 Τι ειναι τουτο ρε τιμο; 1) char **strs με τερματισμο το NULL 2) char *strs με διαχωρισμο το \0 και τερματισμο το \0\0 Δες το ως μία πάρα πολύ απλή κλάση string σε C Για το θεωρητικό κομμάτι... είναι incomplete struct, για το οποίο η πλήρης δέσμευση μνήμης γίνεται με χρήση δείκτη όπου δεσμεύεις μνήμη για τις "σταθερές" μεταβλητές σου και τόση μνήμη όση χρειάζεται και ο undefined array σου.
Genevil Δημοσ. 25 Οκτωβρίου 2011 Δημοσ. 25 Οκτωβρίου 2011 Ποπο, λοιπόν εντάξει παιδιά ευχαριστώ για την προσπάθεια, άλλα μπερδεύτηκα τρομερά με τα strings.. Ουσιαστικά για μας είναι εκτός ύλης αυτά που ρωτάω έτσι κι αλλιώς, απλά ήθελα να κάνω λίγο πιο αποτελεσματικό τον κώδικά μου.. Αλλά με μαθήματα λιγότερα του μήνα δε βγαίνει μάλλον... Κατάλαβα όμως, παραδόξως, πως δουλεύουν οι δυναμικοί πίνακες που παίρνουν ως στοιχεία αριθμούς... Και πάλι ευχαριστώ... Και κάτι ακόμα, έχετε να προτείνετε κανένα καλό site με tutorials γενικά για τη c; Κατά προτίμηση στα Ελληνικά, αλλά και στα Αγγλικά θα το παλέψω...
migf1 Δημοσ. 25 Οκτωβρίου 2011 Δημοσ. 25 Οκτωβρίου 2011 ... Και κάτι ακόμα, έχετε να προτείνετε κανένα καλό site με tutorials γενικά για τη c; Κατά προτίμηση στα Ελληνικά, αλλά και στα Αγγλικά θα το παλέψω... Για δες από εδώ και κάτω μήπως σε βοηθήσει.
smufes Δημοσ. 22 Απριλίου 2015 Δημοσ. 22 Απριλίου 2015 Παιδία επειδή είμαι αρχάριος στην γλώσσα προγραμματισμού c θα ήθελα να ρωτήσω πώς θα κατασκευάσω μια συνάρτηση η οποία θα δέχεται σαν παράμετρο ένα λεξικό (έναν δισδιάστατο πίνακα κειμένου) και μια λέξη και να επιστρέφει τον χαρακτήρα της λέξης, αν υπάρχει, που δεν υπάρχει σε καμιά λέξη του λεξικού θεωρώντας ίδιους τους αντίστοιχους πεζούς ή κεφαλαίους χαρακτήρες.. το όλο πρόγραμμα να επιβεβαιώνει την ορθή λειτουργία της συνάρτησης για την αγγλική γλώσσα... προηγουμένως είχα φτιάξει μια συνάρτηση η οποία μετατρέπει μια λέξη που περιέχει λατινικούς χαρακτήρες σε λατινικά πεζά... πως μπορώ να φτιάξω την ποιο πάνω συνάρτηση?
gon1332 Δημοσ. 22 Απριλίου 2015 Δημοσ. 22 Απριλίου 2015 Αν είσαι αρχάριος σε C, δεν είναι θέμα. Θα σε βοηθήσουμε. Πες μας όμως πρώτα τί έχεις σκεφτεί για το πρόβλημα. Θα ήταν καλύτερα, αν έχεις γράψει κάποιο ψευδοκώδικα να μας τον παραθέσεις. Από εκεί και πέρα θα το κουβεντιάσουμε.
smufes Δημοσ. 22 Απριλίου 2015 Δημοσ. 22 Απριλίου 2015 έχω κάνει κάτι αλλά μάλλον είναι λάθος... γιατί μου βγάζει αριθμούς... #include <stdio.h> #include <stdlib.h> #define n #define m void dict_words(int text, char word); int main (void) { int i,j,text; int dictionary[n][m]; printf("please enter word of dictionary: \n"); for (i=0; i<n; i++){ for (j=0; j<m; j++){ printf("dictionary[%d][%d]:\n",i,j); scanf("%d",&word); dictionary[j]= words; } } for(i=0; i<n; i++){ for(j=0; j<m; j++){ printf("B[%d][%d]: %d\n", i, j, B[j]); } } return 0; }
nplatis Δημοσ. 22 Απριλίου 2015 Δημοσ. 22 Απριλίου 2015 Αν δεν κάνεις έστω σωστό copy - paste (και καλύτερα μέσα σε [code] [/code] ) δεν θα μπορέσουμε να σε βοηθήσουμε...
smufes Δημοσ. 22 Απριλίου 2015 Δημοσ. 22 Απριλίου 2015 #include <stdio.h> #include <stdlib.h> #define n #define m void dict_words(int text, char word); int main (void) { int i,j,text; int dictionary[n][m]; printf("please enter word of dictionary: \n"); for (i=0; i<n; i++){ for (j=0; j<m; j++){ printf("dictionary[%d][%d]:\n",i,j); scanf("%d",&word); dictionary[j]= words; } } for(i=0; i<n; i++){ for(j=0; j<m; j++){ printf("B[%d][%d]: %d\n", i, j, B[j]); } } return 0; }
gon1332 Δημοσ. 22 Απριλίου 2015 Δημοσ. 22 Απριλίου 2015 Η αλήθεια είναι ότι δεν κατάλαβα τί θες να κάνεις στον κώδικά σου. Σου εμφανίζει αριθμούς, προφανώς γιατί αριθμούς βάζεις. Επίσης το dictionary δεν είναι ένας πίνακας από λέξεις; Δηλαδή κάτι τέτοιο; 0] "ένα" 1] "τέσσερα" 2] "τρία" . . . Αν ναι, τότε θέλεις ένα πίνακα από strings ή διαφορετικά ένα διδιάστατο πίνακα από χαρακτήρες. Για δες μία αυτό που έκανα. Παίξε λίγο μαζί του και πες μου αν κάτι τέ- τοιο ήθελες: Με παράδειγμα #include <stdio.h> #define NUM_WORDS 3 #define WORD_SIZE 20 int main(void) { int i; char dictionary[NUM_WORDS][WORD_SIZE]; char word_fmt[20] = { '\0' }; sprintf(word_fmt, "%%%ds", WORD_SIZE-1); printf("Populate the dictionary with %d words:", NUM_WORDS); for (i = 1; i <= NUM_WORDS; i++) { printf("\n%d> ", i); scanf(word_fmt, &dictionary[i-1]); } putchar("\n"); printf("\nPrinting dictionary:\n"); for (i = 0; i < NUM_WORDS; i++) { printf("[%d]: \"%s\"\n", i, dictionary[i]); } return 0; }
smufes Δημοσ. 22 Απριλίου 2015 Δημοσ. 22 Απριλίου 2015 σε ευχαριστώ πολύ για την βοήθεια... ναι αυτό ήθελα...
gon1332 Δημοσ. 22 Απριλίου 2015 Δημοσ. 22 Απριλίου 2015 OK! Καταλαβαίνεις γιατί δουλεύει το παραπάνω; Έχεις κάποια απορία στον κώδικα; Γιατί δεν το κατάφερες με την πρώτη.
smufes Δημοσ. 22 Απριλίου 2015 Δημοσ. 22 Απριλίου 2015 Τον κώδικα τον έχω καταλάβει... αν θέλω όμως να επιστρέφει δυο συνεχόμενους χαρακτήρες της λέξης? τι θα άλλαζα? μήπως εκεί που μου έχεις γράψει στον κώδικα WORD_SIZE-1 να το κάνω -2 και αυτό έτσι scanf(word_fmt, &dictionary[i-2]);
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα