dim94 Δημοσ. 23 Δεκεμβρίου 2012 Δημοσ. 23 Δεκεμβρίου 2012 Καλησπερα ,ειμαι αρχαριος στην C και θα ηθελα σας παρακαλω την βοηθεια σας στην παρακατω ασκηση: Σχεδιάστε αλγόριθμο ο οποίος διαβάζει ένα σύνολο από αλφαριθμητικά και: (i) καταγράφει αυτό με το μικρότερο μήκος Σας παραθετω τον κωδικα μου(για το ερωτημα αυτο) : #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1 main() { char *ar, ch; int k=0, i=0, *num, temp, j; ar=malloc(N*sizeof(char)); num=malloc(N*sizeof(int)); do{ for(; ; ) { printf("Dwste xarakthra alfarithmitikou,0 gia telos: "); scanf("%c",&ch); if(ch=='0') break; ar=ch; ++i; ar=realloc(ar,i*sizeof(char)); } num[k]=strlen(ar); printf("to megethos einai %d",strlen(ar)/2); ++k; num=realloc(num,k*sizeof(int)); printf("Pieste 0 gia telos alfarithmitikwn,1 gia neo:"); scanf("%d",&temp); }while(temp!=0); } Εαν τρεξετε τον κωδικα θα διαπιστωσετε κι εσεις οτι μπαινει στην for διπλες και τριπλες φορες καθε φορα(αφου βγαζει το μηνυμα της printf διπλες-τριπλες φορες αντιστοιχα) με αποτελεσμα να μου χαλαει τους μετρητες.Επισης εχω την εντυπωση οτι χρησιμοποιω λανθασμενα την realloc! Μπορειτε να βοηθησετε; Ευχαριστω
albNik Δημοσ. 23 Δεκεμβρίου 2012 Δημοσ. 23 Δεκεμβρίου 2012 Η strlen(ar) δεν μπορεί να βρει το μέγεθος γιατί ο πίνακας δεν κλείνει με '\0'. Κάνε realloc (i+1) bytes και βάλε '\0' στο τέλος. ar[i+1]='\0'; Γιατί μισό? strlen(ar)/2
dim94 Δημοσ. 23 Δεκεμβρίου 2012 Μέλος Δημοσ. 23 Δεκεμβρίου 2012 Η strlen(ar) δεν μπορεί να βρει το μέγεθος γιατί ο πίνακας δεν κλείνει με '\0'.Κάνε realloc (i+1) bytes και βάλε '\0' στο τέλος. ar[i+1]='\0'; Γιατί μισό? strlen(ar)/2 Το προβλημα δεν ειναι η strlen τοσο.Για το μεγεθος μπορω να βαλω και num[k]=i-1 .(ειχα βαλει /2 γιατι μπαινει διπλες φορες μεσα στην for αλλα δεν ειναι αποτελεσματικο γιατι μετα μπαινει 3 πλες φορες..) Το προβλημα οπως ειπα και πριν ειναι με τις επαναληψεις...Αν δοκιμασεις να το τρεξεις θα το δεις και εσυ
nilosgr Δημοσ. 23 Δεκεμβρίου 2012 Δημοσ. 23 Δεκεμβρίου 2012 Η for τρέχει πολλές φορές επειδή κανείς scanf έναν χαρακτήρα. Αυτό είναι πολύ λάθος, για "διάφορους" λόγους. Αν ψάξεις στο φόρουμ θα βρεις αρκετά παρόμοια θέματα
dim94 Δημοσ. 23 Δεκεμβρίου 2012 Μέλος Δημοσ. 23 Δεκεμβρίου 2012 Η for τρέχει πολλές φορές επειδή κανείς scanf έναν χαρακτήρα. Αυτό είναι πολύ λάθος, για "διάφορους" λόγους. Αν ψάξεις στο φόρουμ θα βρεις αρκετά παρόμοια θέματα Ευχαριστω. Δηλαδη μου προτεινετε να χρησιμοποιω getchar;
bird Δημοσ. 23 Δεκεμβρίου 2012 Δημοσ. 23 Δεκεμβρίου 2012 Ευχαριστω. Δηλαδη μου προτεινετε να χρησιμοποιω getchar; Και getchar() να χρησιμοποιήσεις πάλι έναν χαρακτήρα θα διαβάζεις...
dim94 Δημοσ. 23 Δεκεμβρίου 2012 Μέλος Δημοσ. 23 Δεκεμβρίου 2012 Και getchar() να χρησιμοποιήσεις πάλι έναν χαρακτήρα θα διαβάζεις... Ναι το ξερω,απλα απ οτι καταλαβα με getchar δεν εμφανιζονται προβληματα απ το πουθενα!
bird Δημοσ. 23 Δεκεμβρίου 2012 Δημοσ. 23 Δεκεμβρίου 2012 (επεξεργασμένο) Αν κατάλαβα καλά, στη for θέλεις να δίνεις τους χαρακτήρες του αλφαρηθμιτικού έναν έναν και όταν τελειώσει το αλφαρηθμιτικό να δώσεις 0 για να σταματήσει να διαβάζει. Όταν πατάς enter για να γινει η καταχώρηση του χαρακτήρα, μένει στον buffer και το enter (newline '\n') που πάτησες οπότε στην επόμενη φορά που μπαίνει στη for υπάρχει αυτός ο χαρακτήρας και τον διαβάζει. Αν κοιτάξεις στο forum υπάρχουν συζητήσεις σχετικά με το θέμα, εγώ αυτό που χρησιμοποιώ συνήθως είναι μετά την scanf() ή την getchar() βάζω έναν κώδικα της μορφής: while ( (c=getchar()) !='\n' && c != EOF); όπου το c έχει οριστεί στην αρχή σαν int Επεξ/σία 23 Δεκεμβρίου 2012 από bird
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα