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

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

Δημοσ.

Καλησπερα ,ειμαι αρχαριος στην 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! Μπορειτε να βοηθησετε;

 

Ευχαριστω

Δημοσ.

Η strlen(ar) δεν μπορεί να βρει το μέγεθος γιατί ο πίνακας δεν κλείνει με '\0'.

Κάνε realloc (i+1) bytes και βάλε '\0' στο τέλος.

ar[i+1]='\0';

 

Γιατί μισό? strlen(ar)/2

Δημοσ.
Η strlen(ar) δεν μπορεί να βρει το μέγεθος γιατί ο πίνακας δεν κλείνει με '\0'.

Κάνε realloc (i+1) bytes και βάλε '\0' στο τέλος.

ar[i+1]='\0';

 

Γιατί μισό? strlen(ar)/2

 

Το προβλημα δεν ειναι η strlen τοσο.Για το μεγεθος μπορω να βαλω και num[k]=i-1 .(ειχα βαλει /2 γιατι μπαινει διπλες φορες μεσα στην for αλλα δεν ειναι αποτελεσματικο γιατι μετα μπαινει 3 πλες φορες..) Το προβλημα οπως ειπα και πριν ειναι με τις επαναληψεις...Αν δοκιμασεις να το τρεξεις θα το δεις και εσυ

Δημοσ.

Η for τρέχει πολλές φορές επειδή κανείς scanf έναν χαρακτήρα. Αυτό είναι πολύ λάθος, για "διάφορους" λόγους. Αν ψάξεις στο φόρουμ θα βρεις αρκετά παρόμοια θέματα

Δημοσ.
Η for τρέχει πολλές φορές επειδή κανείς scanf έναν χαρακτήρα. Αυτό είναι πολύ λάθος, για "διάφορους" λόγους. Αν ψάξεις στο φόρουμ θα βρεις αρκετά παρόμοια θέματα

Ευχαριστω. Δηλαδη μου προτεινετε να χρησιμοποιω getchar;

Δημοσ.
Ευχαριστω. Δηλαδη μου προτεινετε να χρησιμοποιω getchar;

Και getchar() να χρησιμοποιήσεις πάλι έναν χαρακτήρα θα διαβάζεις...

Δημοσ.
Και getchar() να χρησιμοποιήσεις πάλι έναν χαρακτήρα θα διαβάζεις...

Ναι το ξερω,απλα απ οτι καταλαβα με getchar δεν εμφανιζονται προβληματα απ το πουθενα!  :ph34r: 

 

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

Αν κατάλαβα καλά, στη for θέλεις να δίνεις τους χαρακτήρες του αλφαρηθμιτικού έναν έναν και όταν τελειώσει το αλφαρηθμιτικό να δώσεις 0 για να σταματήσει να διαβάζει. Όταν πατάς enter για να γινει η καταχώρηση του χαρακτήρα, μένει στον buffer και το enter (newline '\n') που πάτησες οπότε στην επόμενη φορά που μπαίνει στη for υπάρχει αυτός ο χαρακτήρας και τον διαβάζει.

Αν κοιτάξεις στο forum υπάρχουν συζητήσεις σχετικά με το θέμα, εγώ αυτό που χρησιμοποιώ συνήθως είναι μετά την scanf() ή την getchar() βάζω έναν κώδικα της μορφής:

while ( (c=getchar()) !='\n' && c != EOF);

όπου το c έχει οριστεί στην αρχή σαν int

Επεξ/σία από bird

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...