Δυναμική μνήμη μαζί με typedef struct δομή

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

Re: Δυναμική μνήμη μαζί με typedef struct δομή

Δημοσίευσηαπό Tasudo » 28 Ιούλ 2011, 11:41

Μπορώ να πώ ότι κατάλαβα πλέον,σε ευχαριστώ πολύ και να είσαι σίγουρος ότι διάβασα τον κώδικα εις βάθος.
Απλά σε ότι σύγραμμα έχω πάνω σε C δεν έχει τίποτα πάνω σε δυναμική μνήμη και ό,τι ξέρω το διάβασα μέσα από ένα όχι και τόσο ευανάγνωστο pdf και είναι ΚΑΙ αυτός ένας λογος που τα μπερδεύω και τα κάνω μαντάρα

Επίσης,υπάρχει τρόπος διαχωρισμού των ψηφίων μέσα από ένα string?
Για παράδειγμα

string[1] = "54 Palaion Patron"

υπάρχει τρόπος να αναγνωριστούν τα ψηφία 5 και 4 και να εκχωρηθούν σε κάποιο άλλο string για παράδειγμα?
ΜΗΝ μου δώσετε λύση μέσω κώδικα,μόνο τα απαραίτητα "εργαλεία"αν γίνεται γιατί θέλω να το προσπαθήσω.

Έχω διαβάσει κάποιες συναρτήσεις της <ctype.h> όπως την isdigit αλλά δεν κατάλαβα πώς θα μπορούσαν να
χρησιμοποιηθούν στην συγκεκριμένη περίσταση
Tasudo
babeTUX
babeTUX
 
Δημοσιεύσεις: 16
Εγγραφή: 24 Ιούλ 2011, 18:27
Εκτύπωση

Re: Δυναμική μνήμη μαζί με typedef struct δομή

Δημοσίευσηαπό migf1 » 28 Ιούλ 2011, 12:52

Tasudo έγραψε:Μπορώ να πώ ότι κατάλαβα πλέον,σε ευχαριστώ πολύ και να είσαι σίγουρος ότι διάβασα τον κώδικα εις βάθος.
Απλά σε ότι σύγραμμα έχω πάνω σε C δεν έχει τίποτα πάνω σε δυναμική μνήμη και ό,τι ξέρω το διάβασα μέσα από ένα όχι και τόσο ευανάγνωστο pdf και είναι ΚΑΙ αυτός ένας λογος που τα μπερδεύω και τα κάνω μαντάρα

Ότι απορία έχεις και ξέρω πολύ ευχαρίστως να βοηθήσω! Δεν ξέρω αν μιλάμε στα πλαίσια κάποιας σχολής ή απλά δικιάς σου ενασχόλησης, αλλά αν είναι το 2ο ίσως είναι καλύτερα να ξεκινήσεις με όσο το δυνατόν πιο απλά παραδείγματα μπορείς. Π.χ. αντί για τη δομή infoT που αποτελείται από δυο strings, θα μπορούσες να ξεκινήσεις με μια απλούστερη δομή, όπως π.χ.
Κώδικας: Επιλογή όλων
typdef struct point{
int x, y;
} Point

που δεν έχει strings της μέσα της για να σε μπερδεύουν.

έγραψε:
Επίσης,υπάρχει τρόπος διαχωρισμού των ψηφίων μέσα από ένα string?
Για παράδειγμα

string[1] = "54 Palaion Patron"

υπάρχει τρόπος να αναγνωριστούν τα ψηφία 5 και 4 και να εκχωρηθούν σε κάποιο άλλο string για παράδειγμα?
ΜΗΝ μου δώσετε λύση μέσω κώδικα,μόνο τα απαραίτητα "εργαλεία"αν γίνεται γιατί θέλω να το προσπαθήσω.

Έχω διαβάσει κάποιες συναρτήσεις της <ctype.h> όπως την isdigit αλλά δεν κατάλαβα πώς θα μπορούσαν να
χρησιμοποιηθούν στην συγκεκριμένη περίσταση

Ο παραπάνω ορισμός είναι λάθος, γιατί ορίζεις το string να έχει μέγιστο μήκος 1 χαρακτήρα, αλλά το αρχικοποιείς με τιμή που έχει 18 χαρακτήρες (τον 18ο τον βάζει η C για το '\0' στην προκειμένη περίπτωση).

Τώρα, σχετικά με τον διαχωρισμό των χαρακτήρων ενός string, είναι ήδη ξεχωρισμένα. Τα strings είναι πίνακες χαρακτήρων (απλά πρέπει να έχουν τον χαρακτήρα '\0' στο τέλος τους). Οπότε αν δηλώσεις το παραπάνω σωστά, π.χ.
Κώδικας: Επιλογή όλων

char string[18] = "54 Palaion Patron";

τότε το string[0] είναι ο 1ος χαρακτήρας (δηλαδή το '5') και το string[16] είναι ο 17ος χαρακτήρας (δηλαδή το 'n')... το string[17] είναι το '\0'.

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

Re: Δυναμική μνήμη μαζί με typedef struct δομή

Δημοσίευσηαπό Tasudo » 28 Ιούλ 2011, 18:24

Στο συγκεκριμένο πρόγραμμα θέλω να κάνω τώρα το εξής

αν για παράδειγμα το

pairs[1].word = kalimera123

θέλω τα ψηφία 123 να τα εκχωρήσω-αποθηκεύσω στην pairs[1].digits και ούτω καθεξής για όσες λέξεις έχουνε εισαχθεί.
Προσπάθησα να δουλέψω με την isdigit αλλα πρέπει να κάνω λαθος στην χρήση γιατί είναι σαν να μην εκτελείται μέσα στο πρόγραμμα,άρα κάπου πάλι τα σκα****σα :cry:

Έτρεξα με debugger για να δω γραμμη γραμμη τι γίνεται αλλά και πάλι δεν μπορώ να βρώ την αιτία...

το ιδανικότερο θα ήτανε να το κάνω αυτό μέσω μιας συνάρτησης που θα έπαιρνε ως παράμετρο το word και αν είχε ψηφία να τα έσωζε σε ένα νέο string
που θα αποθηκευότανε στο pairs[i].digits

παραθέτω τον κώδικα που έγραψα

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


for (i=0; i<numwords; i++) {
for (j=0; j<strlen(pairs[i].word); j++) {
if (isdigit(pairs[i].word[j]) ) {
// strcat(pairs[i].digits[j],pairs[i].word[j]);//
pairs[i].digits[j] = pairs[i].word[j];
}
}
printf("%s\n ",pairs[i].digits);
}
Tasudo
babeTUX
babeTUX
 
Δημοσιεύσεις: 16
Εγγραφή: 24 Ιούλ 2011, 18:27
Εκτύπωση

Re: Δυναμική μνήμη μαζί με typedef struct δομή

Δημοσίευσηαπό migf1 » 28 Ιούλ 2011, 19:11

Κώδικας: Επιλογή όλων
#include <ctype.h>

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

char *getdigits(char *digs, const char *src)
{
if ( !digs || !src )
return NULL;

register int i, j=0;
for (i=0; src[i] != '\0'; i++)
if ( isdigit( src[i] ) )
digs[j++] = src[i];
return digs;
}

ή αν αισθάνεσαι πιο άνετα με δείκτες...
Κώδικας: Επιλογή όλων

char *getdigits(char *digs, const char *src)
{
if ( !digs || !src )
return NULL;

register char *cp;
for (cp=digs; *src; src++)
if ( isdigit(*src) )
*cp++ = *src;
return digs;
}

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

Re: Δυναμική μνήμη μαζί με typedef struct δομή

Δημοσίευσηαπό Tasudo » 28 Ιούλ 2011, 20:10

Ξέρω ότι θα γίνω κουραστικός αλλά και κάτι επιπλέον γιατί στο βιβλίο του Deitel δεν το βρήκα
όταν έχω μια δομή στη συγκεκριμένη περίπτωση την

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

typedef struct {
char word[WORDSIZE];
char digits[WORDSIZE];
} infoT;


και υπάρχει μια συνάρτηση στην οποία θέλω να εισάγω ως παραμέτρους τα word και digits της δομης αυτης τα οποία μέσα στην δομή είναι ορισμένα ως char,στη συγκέκριμένη περίπτωση η συνάρτησή σου
Κώδικας: Επιλογή όλων

char *getdigits(char *digs, const char *src)


Στην κλήση της συνάρτησης getedits(.....) πως θα εισαχθούνε τα digits και τα word γιατι
αυτα δεν υπαρχουνε δηλωμενα μεσα στην main αρα κατα συνεπεια ο compiler θα σημειωσει σφαλμα γιατι ειναι undeclared
Tasudo
babeTUX
babeTUX
 
Δημοσιεύσεις: 16
Εγγραφή: 24 Ιούλ 2011, 18:27
Εκτύπωση

Re: Δυναμική μνήμη μαζί με typedef struct δομή

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

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

for (i=0; i < numwords; i++)
getdigits( pairs[i].digits, pairs[i].word );


;)

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

Προηγούμενη

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

cron