Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Ωραία οσον αφορά πίνακες μορφής 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;

 

κτλ.

  • Απαντ. 31
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσ. (επεξεργασμένο)

Ωραία οσον αφορά πίνακες μορφής 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 ];
  ...

Επεξ/σία από migf1
Δημοσ.

Τι ειναι τουτο ρε τιμο;

 

1) char **strs με τερματισμο το NULL

2) char *strs με διαχωρισμο το \0 και τερματισμο το \0\0

 

 

Δες το ως μία πάρα πολύ απλή κλάση string σε C :P

 

Για το θεωρητικό κομμάτι... είναι incomplete struct, για το οποίο η πλήρης δέσμευση μνήμης γίνεται με χρήση δείκτη όπου δεσμεύεις μνήμη για τις "σταθερές" μεταβλητές σου και τόση μνήμη όση χρειάζεται και ο undefined array σου.

Δημοσ.

Ποπο, λοιπόν εντάξει παιδιά ευχαριστώ για την προσπάθεια, άλλα μπερδεύτηκα τρομερά με τα strings..

Ουσιαστικά για μας είναι εκτός ύλης αυτά που ρωτάω έτσι κι αλλιώς, απλά ήθελα να κάνω λίγο πιο αποτελεσματικό τον κώδικά μου.. Αλλά με μαθήματα λιγότερα του μήνα δε βγαίνει μάλλον...

Κατάλαβα όμως, παραδόξως, πως δουλεύουν οι δυναμικοί πίνακες που παίρνουν ως στοιχεία αριθμούς...

Και πάλι ευχαριστώ...

 

Και κάτι ακόμα, έχετε να προτείνετε κανένα καλό site με tutorials γενικά για τη c;

Κατά προτίμηση στα Ελληνικά, αλλά και στα Αγγλικά θα το παλέψω...

  • 3 χρόνια αργότερα...
Δημοσ.

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

 

προηγουμένως είχα φτιάξει μια συνάρτηση η οποία μετατρέπει μια λέξη που περιέχει λατινικούς χαρακτήρες σε λατινικά πεζά...

 

πως μπορώ να φτιάξω την ποιο πάνω συνάρτηση?

Δημοσ.

Αν είσαι αρχάριος σε C, δεν είναι θέμα. Θα σε βοηθήσουμε.

Πες μας όμως πρώτα τί έχεις σκεφτεί για το πρόβλημα. Θα

ήταν καλύτερα, αν έχεις γράψει κάποιο ψευδοκώδικα να μας

τον παραθέσεις. Από εκεί και πέρα θα το κουβεντιάσουμε.

Δημοσ.

έχω κάνει κάτι αλλά μάλλον είναι λάθος... γιατί μου βγάζει αριθμούς...

 

 

 

#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;
}
Δημοσ.
#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;

}

Δημοσ.

Η αλήθεια είναι ότι δεν κατάλαβα τί θες να κάνεις στον κώδικά σου.

Σου εμφανίζει αριθμούς, προφανώς γιατί αριθμούς βάζεις.

 

Επίσης το 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;
}
Δημοσ.

OK! Καταλαβαίνεις γιατί δουλεύει το παραπάνω;

Έχεις κάποια απορία στον κώδικα; Γιατί δεν το

κατάφερες με την πρώτη.

Δημοσ.

Τον κώδικα τον έχω καταλάβει... αν θέλω όμως να επιστρέφει δυο συνεχόμενους χαρακτήρες της λέξης? τι θα άλλαζα?

 

μήπως εκεί που μου έχεις γράψει στον κώδικα WORD_SIZE-1  να το κάνω -2 και αυτό έτσι

scanf(word_fmt, &dictionary[i-2]);

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...