Πρόβλημα σε πρόγραμμα με pointers,arrays & strings

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

Πρόβλημα σε πρόγραμμα με pointers,arrays & strings

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

Καλησπέρα

Σπουδάζω μηχ Η/Υ και εξασκούμαι στην C

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

Κώδικας: Επιλογή όλων
echo\"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAXWORDS 5
#define WORDSIZE 20

void check_memory(char *); //Dilosi sunartisis pou kanei elegxo gia tin dunamiki diaxeirisi mnimis//
void clear_memory(char *, char **); //Dilosi sunartisis pou apeleu8eronei tin dynamika deusmeumeni mnimi//

int main (int argc, char *argv[]) {

int i,words_size;
char *words[MAXWORDS];
char *new_string;

words_size = 0;

for (i=0; i<MAXWORDS; i++) {
words[i] = (char *)malloc(sizeof(char)*WORDSIZE); //Dynamiki desmeusi mnimis//
check_memory(words[i]); //klisi sunartisis gia ton elegxo mnimis//
scanf("%s",words[i]); //eisagogi leksis apo ton xristi//

if( i < (MAXWORDS - 1) ) { //Elegxos oste na kataxori8ei stin new_string o apaitoumenos xoros//
words_size = strlen(words[i]) + 1;
}
else {
words_size = strlen(words[i]);
}

}
new_string = (char *)malloc(sizeof(char)*words_size); //Dynamiki desmeusi mnimis//
check_memory(new_string); //klisi sunartisis gia ton elegxo mnimis//

for (i=0; i<MAXWORDS; i++) { //Se auto to simio ''metaferontai'' ta stoixeia apo tin words stin new_string//
if ( (i = (MAXWORDS - 1) ) ) {
strcat(new_string,words[i]);
}
else {
strcat(new_string," "); //oses lekseis einai diadoxikes exoune ena keno anamesa tous//
strcat(new_string,words[i]);

}
}

printf("%s\n ", new_string);
clear_memory(new_string,words);

return 0;
}

void check_memory(char *mem) {
if (mem==NULL) {
printf("Memory allocation error\n");
exit(1);
}
}

void clear_memory(char *string, char **words_cleanse){

int i;

free(string);
for (i=0; i<MAXWORDS; i++) {
free(words_cleanse[i]);
}
}
\";
Tasudo
babeTUX
babeTUX
 
Δημοσιεύσεις: 16
Εγγραφή: 24 Ιούλ 2011, 18:27
Εκτύπωση

Re: Πρόβλημα σε πρόγραμμα με pointers,arrays & strings

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

Δεν έχω προλάβει να δω τον κώδικά σου καλά, αλλά στο 1ο... σκαν εντόπισα αυτό:
Κώδικας: Επιλογή όλων

for (i=0; i<MAXWORDS; i++) { //Se auto to simio ''metaferontai'' ta stoixeia apo tin words stin new_string//
if ( (i = (MAXWORDS - 1) ) ) {

υποθέτω στο if ήθελες να γράψεις == αντί για = που έχεις τώρα.

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

Re: Πρόβλημα σε πρόγραμμα με pointers,arrays & strings

Δημοσίευσηαπό Tasudo » 25 Ιούλ 2011, 16:37

Όντως ένα λάθος εκεί,ευχαριστώ.

Το πρόβλημα είναι ότι κατά την εκτέλεση του προγράμματος στο command line πλεον τερματίζει απότομα γράφωντας aborted και μετά το χάος ψηφίων.

Δεν μπορώ να εντοπίσω αν το λάθος είναι λογικό ή συντακτικό...
Tasudo
babeTUX
babeTUX
 
Δημοσιεύσεις: 16
Εγγραφή: 24 Ιούλ 2011, 18:27
Εκτύπωση

Re: Πρόβλημα σε πρόγραμμα με pointers,arrays & strings

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

Δεν έχω καταλάβει την εκφώνηση της άσκησης, κι από τον κώδικά σου δεν πολυ-καταλαβαίνω.

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

Re: Πρόβλημα σε πρόγραμμα με pointers,arrays & strings

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

migf1 έγραψε:Δεν έχω καταλάβει την εκφώνηση της άσκησης, κι από τον κώδικά σου δεν πολυ-καταλαβαίνω.

Τι ακριβώς προσπαθείς να κάνεις; Θες να διαβάσεις 5 strings σε έναν πίνακα από strings (ένα string στην κάθε θέση του πίνακα) και μετά να φτιάξεις ένα μεγάλο string που θα περιέχει τα 5 strings του πίνακα με ένα κενό διάστημα μεταξύ τους;

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

Re: Πρόβλημα σε πρόγραμμα με pointers,arrays & strings

Δημοσίευσηαπό linuxs » 26 Ιούλ 2011, 15:52

το λάθος θα πρέπει αν είναι λογικό. Το πρόγραμμα τρέχει(αν και δεν έχω καταλάβει τι ακριβώς θέλεις να κάνεις).
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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: Πρόβλημα σε πρόγραμμα με pointers,arrays & strings

Δημοσίευσηαπό Tasudo » 27 Ιούλ 2011, 12:03

Έκανα κάποιες μικρές αλλαγές στον κώδικα και το αποτέλεσμα είναι πλέον το επιθυμητό αλλά κάνω λάθος με την δυναμική διαχείριση μνήμης και δεν μπορώ να το εντοπίσω
Το πρόγραμμα έχει ως σκοπό περιλιπτικά:
1)Να διαβαστούνε ΜΑΧWORDS λέξεις(strings) που θα αποθηκευτούνε σε έναν πίνακα από pointers σε char
2)Να υπολογιστεί το "μήκος" που καταλαμβάνουνε
3)Να εκχωρηθούνε σε ένα νέο string στο οποίο θα έχουνε μεταξύ τους ένα κενό και να τυπώνεται το αποτέλεσμα στην οθόνη

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

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

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAXWORDS 5
#define WORDSIZE 20

void check_memory(char *); //Dilosi sunartisis pou kanei elegxo gia tin dunamiki diaxeirisi mnimis//
void clear_memory(char *, char **); //Dilosi sunartisis pou apeleu8eronei tin dynamika deusmeumeni mnimi//

int main (int argc, char *argv[]) {

int i,words_size;
char *words[MAXWORDS];
char *new_string;

words_size = 0;

for (i=0; i<MAXWORDS; i++) {
words[i] = (char *)malloc(sizeof(char)*WORDSIZE); //Dynamiki desmeusi mnimis//
check_memory(words[i]); //klisi sunartisis gia ton elegxo mnimis//
scanf("%s",words[i]); //eisagogi leksis apo ton xristi//

if( i < (MAXWORDS - 1) ) { //Elegxos oste na kataxori8ei stin new_string o apaitoumenos xoros//
words_size = strlen(words[i]) + 1;
}
else {
words_size = strlen(words[i]);
}

}
new_string = (char *)malloc(sizeof(char)*words_size); //Dynamiki desmeusi mnimis//
check_memory(new_string); //klisi sunartisis gia ton elegxo mnimis//


strcat(new_string,words[0]);
for (i=1; i<MAXWORDS; i++) { //Se auto to simio ''metaferontai'' ta stoixeia apo tin words stin new_string//
strcat(new_string," "); //oses lekseis einai diadoxikes exoune ena keno anamesa tous//
strcat(new_string,words[i]);

}


printf("%s\n ", new_string);
clear_memory(new_string,words);

return 0;
}

void check_memory(char *mem) {
if (mem==NULL) {
printf("Memory allocation error\n");
exit(1);
}
}

void clear_memory(char *string, char **words_cleanse){

int i;

free(string);
for (i=0; i<WORDSIZE; i++) {
free(words_cleanse[i]);
}
}
Tasudo
babeTUX
babeTUX
 
Δημοσιεύσεις: 16
Εγγραφή: 24 Ιούλ 2011, 18:27
Εκτύπωση

Re: Πρόβλημα σε πρόγραμμα με pointers,arrays & strings

Δημοσίευσηαπό migf1 » 27 Ιούλ 2011, 13:31

Τον κώδικα που σου έδωσα παραπάνω τον είδες; Κάνει ότι ζητάς (εκτός από το να μετράει το μήκος των λέξεων, που είναι ένα απλό strlen() στην καθεμιά τους). Όπου έχεις MAXWORDS έχω βάλει NWORDS κι όπου έχεις WORDSIZE έχω βάλει MAXWLEN. Επίσης, όπου έχεις new_newstring έχω βάλει outstring. Πάνω στον δικό σου κώδικα είναι βασισμένος κι αυτός που έχω ποστάρει, απλά διαχειρίζομαι μόνος μου το input του χρήστη αντί να χρησιμοποιώ την scanf.
Τελευταία επεξεργασία από migf1 και 27 Ιούλ 2011, 13:45, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Πρόβλημα σε πρόγραμμα με pointers,arrays & strings

Δημοσίευσηαπό migf1 » 27 Ιούλ 2011, 13:34

Αλλά είδα μια απροσεξία μου τώρα, στην main() άλλαξε το:
Κώδικας: Επιλογή όλων

for (j=i; j > -1; j--) // already allocated so far...
free( words[j] ); // inform user and exit program

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

for (j=i-1; j > -1; j--) // already allocated so far...
free( words[j] ); // inform user and exit program


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


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

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

cron