fgets(), while loops & problems..

Remalia
Verfügbare Informationen zu "fgets(), while loops & problems.."

  • Qualität des Beitrags: 0 Sterne
  • Beteiligte Poster: Kid - Thinker_ - parsifal - psolid_snake
  • Forum: Remalia
  • Forenbeschreibung: Official forum of Remalia (Ntk & Friends)
  • aus dem Unterforum: Προγραμματισμός σε C/C++, Java, Fortran etc.
  • Antworten: 13
  • Forum gestartet am: Samstag 02.09.2006
  • Sprache: englisch
  • Link zum Originaltopic: fgets(), while loops & problems..
  • Letzte Antwort: vor 16 Jahren, 9 Monaten, 25 Tagen, 10 Stunden, 4 Minuten
  • Alle Beiträge und Antworten zu "fgets(), while loops & problems.."

    Re: fgets(), while loops & problems..

    Kid - 01.06.2007, 19:22

    fgets(), while loops & problems..
    Code: Random_Keys = (char*)malloc(Encryption_Strength*sizeof(char));
    while (strcmp(Key_Acception, "No") == 0) {
       for (i = 0 ; i < Encryption_Strength ; i++){
          temp = (rand()%36);
          Random_Keys[i] = Keys[temp];
       }
       printf("Key: %s will be used for the encryption\n", Random_Keys);
       printf("Do you want to keep it?\n");
       printf("Yes/No: ");
       fgets(Key_Acception, 4, stdin);
    }
    Δουλεύει κανονικά το while-loop αλλά συμπεριφέρεται σαν να μην βλέπει την fgets(). Όλες οι παραπάνω εντολές δουλεύουνε κανονικότατα, αλλά με το που φτάνει στο fgets() βγαίνει από το loop χωρίς να περιμένει κάποιο input από τον χρήστη. Αν σβήσω την fgets() το loop επαναλαμβάνεται χωρίς να σταματάει. Καμιά ιδέα για το τι φταίει? :roll:



    Re: fgets(), while loops & problems..

    Thinker_ - 02.06.2007, 12:37


    Tip: Καταρχήν, προτείνω την επόμενη φορά να κανεις quote και τις δηλώσεις των μεταβλητών, γιατι μπορεί να έχει γίνει μαλακία εκει. Αν δεν θέλεις να αποκαλύψεις βέβαια ολόκληρο τον κώδικα, δοκίμασε να κόψεις το κομμάτι που προκαλεί πρόβλημα και να το μεταφέρεις σε νέο αρχείο με τα dependencies που αυτό συνεπάγεται.


    Το αποτέλεσμα που περιγράφεις, τουλάχιστον από ότι βλέπω, είναι λογικό. Το loop δεν κόβεται πουθενά, απλά είναι θέμα της fgets και ο έλεγχος βγαίνει false. Αν κατάλαβα σωστά, αυτή η ιστορία γίνεται για ένα y/n που θέλεις απο τον χρήστη. Εφόσον το ρεύμα από το οποίο διαβάζεις είναι σταθερά το stdin, χρησιμοποίησε συναρτήσεις που κάνουν απο default χρήση του.

    Λύση 1η: Αν θέλεις να χρησιμοποιήσεις ντε και σώνει fgets, αντικατάστησε με:
    Code: fgets(Key_Acception, sizeof(Key_Acception), stdin)
    (λογικά πρέπει να δουλέψει, αλλά θυμίσου οτι η οικογένεια των gets είναι επικίνδυνη γιατί μαζεύει ότι χαρακτήρα βρεί, που να έχει περισσέψει από προηγούμενη είσοδο από το stdin. Συγκεκριμένα, αν έχεις χρησιμοποιήσει κάποια άλλη προτροπή για είσοδο από το χρήστη με scanf, τότε η scanf δεν διαβάζει το \n και το αφήνει στο stdin, με αποτέλεσμα η επόμενη gets να το παραμαζεύει. Λυση-Μπάλωμα: βάλε μια άκυρη gets να μαζεύει τα σκουπίδια πριν την fgets σου)

    Λύση 2η: Αλλά εγώ θα πρότεινα προτροπή (y/n) στο χρήστη και χρήση της getchar() που είναι και πιο ασφαλής απο την fgets. Τότε κανεις (c τύπου char)
    Code: c = getchar();
    μέσα στο loop, και ο έλεγχος θα είναι:
    Code: c == 'n'

    Αν δεν απατώμαι δε, ότι και να σου δώσει ο χρήστης, η getchar θα κρατήσει μόνο τον πρώτο χαρακτήρα, οπότε αν θες μπορείς να προσθέσεις έναν extra έλεγχο και να ξαναζητάς είσοδο σε περίπτωση χαρακτήρα διαφορου των y,n.

    PS: Τι πρόγραμμα είναι αυτό;



    Re: fgets(), while loops & problems..

    Kid - 02.06.2007, 13:23


    Το έχει αδειάσει το stdin αφού προηγουμένως έχω κάνει fflush(stdin).

    Δεν θέλω y/n, προτιμώ "ολοκληρωμένες" λύσεις (επί της ουσίας καμία διαφορά βέβαια).

    Πρόβλημα στην δήλωση των μεταβλητών δεν υπάρχει επειδή μετά την προσθήκη του fflush(stdin) εκτελείται το loop αλλά εκτελείται 1 φορά χωρίς να δουλέψει το fgets() & την δεύτερη φορά περιμένει για input.

    Η αντικατάσταση που προτείνεις δεν αλλάζει κάτι αφού το size του πίνακα, είναι ορισμένο εξαρχής και δεν δημιουργείται με malloc().

    Encrypter φτιάχνω Γιώργο.



    Re: fgets(), while loops & problems..

    parsifal - 02.06.2007, 13:54


    Σε ποιο σημείο βάζεις την fflush;



    Re: fgets(), while loops & problems..

    Thinker_ - 02.06.2007, 13:58


    Thinker_ wrote: ...θυμίσου οτι η οικογένεια των gets είναι επικίνδυνη γιατί μαζεύει ότι χαρακτήρα βρεί, που να έχει περισσέψει από προηγούμενη είσοδο από το stdin. Συγκεκριμένα, αν έχεις χρησιμοποιήσει κάποια άλλη προτροπή για είσοδο από το χρήστη με scanf, τότε η scanf δεν διαβάζει το \n και το αφήνει στο stdin, με αποτέλεσμα η επόμενη gets να το παραμαζεύει. Λυση-Μπάλωμα: βάλε μια άκυρη gets να μαζεύει τα σκουπίδια πριν την fgets σου...

    'Ισως δεν με κατάλαβες, αλλά ίσως και να φταιω εγώ που δεν το διατύπωσα απλούστερα.
    Γενικά, μια προγραμματιστική τεχνική προτείνει να χρησιμοποιείς, είτε μόνο fputs(), fgets() συναρτήσεις, είτε μόνο fprintf, fscanf, (ή printf, scanf).
    Η άλλη εναλλακτική είναι να χρησιμοποιείς flush techniques για να κρατάς το stdin "καθαρό".
    Π.χ. αυτό που μπορεί να σου κάνει είναι να βάλεις το fflush(stdin); πριν την fgets(). Αν δεν δουλέψει και αυτό, τότε πρέπει να επιλέξεις με ποιες συναρτήσεις θέλεις να προγραμματίσεις.

    That's all._



    Re: fgets(), while loops & problems..

    psolid_snake - 02.06.2007, 13:59


    Δεν υπάρχει λόγος αφού χρησιμοποιείς ως βασικό input το πληκτρολόγιο να κάνεις fgets... Μόνο και μόνο η gets σου αρκεί!! Όπως σου είπα και χθες το προβλημα σου είναι στο έλεγχο της while!!!
    Δοκίμασε μόνο με gets και όλα θα πρέπει να είναι εντάξει!!! Αν τρέξεις μόνο το συγκεκριμένο κομμάτι του κώδικα σου το πρόβλημα εντοπίζεται στην strcmp αν και η fgets έχει κάνει σωστά την δουλειά της πιο πάνω και έχει αποθηκεύσει το σωστό (yes or no) που έχει εισάγει ο χρήστης!!!
    Τουλάχιστον στον κώδικα που σου έστειλα χθες όλα λειτουργούσαν σωστά με την χρήση μόνο της gets...

    Άσε τους encrypter και πιάσε το MINIX ρεεεεεεεεεεε........ :P :P :roll:



    Re: fgets(), while loops & problems..

    parsifal - 02.06.2007, 14:03


    psolid_snake wrote: Δεν υπάρχει λόγος αφού χρησιμοποιείς ως βασικό input το πληκτρολόγιο να κάνεις fgets... Μόνο και μόνο η gets σου αρκεί!!

    Wrong, wrong, wrong! Η gets είναι καλή για προγραμματισμό Α' Έτους, αλλά κατά τα άλλα, είναι απλά για τα μπάζα και ένα μόνιμο security hole, που μπορεί να οδηγήσει σε buffer overflows...



    Re: fgets(), while loops & problems..

    Kid - 02.06.2007, 15:47


    Η gets() δημιουργεί buffer overflow εφόσον δεν ορίζεται το μέγιστο μήκος του string που θα διαβαστεί όπως πολύ σωστά είπε ο Αλέκος.

    Γιώργο δεν γίνεται πλήρης αντικατάσταση της scanf() από την fgets() και αντίστροφα. Αναγκαστικά θα χρησιμοποιήσεις και τις 2. Αντίστοιχα ισχύει το ίδιο και για τις εντολές εκτύπωσης.



    Re: fgets(), while loops & problems..

    psolid_snake - 02.06.2007, 16:23


    Sorry αλλά θα δημιουργηθεί buffer overflow από την gets() για να διαβάσει ένα string το πολύ μήκους 3 (yes or no) ????????????????????????????????? :? :? :? :? :?



    Re: fgets(), while loops & problems..

    parsifal - 02.06.2007, 16:30


    psolid_snake wrote: Sorry αλλά θα δημιουργηθεί buffer overflow από την gets() για να διαβάσει ένα string το πολύ μήκους 3 (yes or no) ????????????????????????????????? :? :? :? :? :?

    Στο συγκεκριμένο παράδειγμα, και αν υποθέσουμε ότι το εκτελέσιμο θα το χρησιμοποιεί μόνο ο Kid, όχι. Σε άλλες περιπτώσεις όμως...;



    Re: fgets(), while loops & problems..

    Kid - 02.06.2007, 16:31


    psolid_snake wrote: Sorry αλλά θα δημιουργηθεί buffer overflow από την gets() για να διαβάσει ένα string το πολύ μήκους 3 (yes or no) ????????????????????????????????? :? :? :? :? :?
    Το θέμα δεν είναι εδώ Κώστα (αν και εδώ μπορεί να δημιουργηθεί πρόβλημα αν ο χρήστης θέλει), γενικά μιλάμε.



    Re: fgets(), while loops & problems..

    psolid_snake - 02.06.2007, 16:56


    Ρε με κοροϊδεύετε.... σίγουρα η gets και όλο της το σόι δεν συμπεριφέρονται καλά αλλά ο κώδικας σου είναι αυτός!!!
    Αν ήταν:
    Code: printf("grapse thn istoria ths zwhs sou\n");
    gets(istoria_ths_zwhs_mou); φυσικά και δεν θα έβαζες gets()...
    Από τη στιγμή όμως που το πρόβλημα σου είναι τόσο μα τόσο απλό δεν χρειάζεται να πνίγεσαι σε μια κουταλιά νερό!!!!
    Φυσικά και ο χρήστης μπορεί να βάλει ότι θέλει και να σου κρεμάσει το πρόγραμμα (πάνω από 68 χαρακτήρες αν θυμάμαι καλά - με την fgets προλαμβάνεις αυτού) αλλά θα αυτή είναι και η επαφή σου με το χρήστη και η δέσμευση του να κάνει θεμιτές-επιτρεπτές διαδικασίες!!!!!!!!! :) :)



    Re: fgets(), while loops & problems..

    Kid - 02.06.2007, 17:17


    Το θέμα είναι ότι δεν υπάρχει λόγος να χρησιμοποιηθεί η gets() όταν η fgets() κάνει ακριβώς το ίδιο.. :wink:



    Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken



    Weitere Beiträge aus dem Forum Remalia

    ekklish gia to anoigma ths sxolhs. - gepostet von twin am Freitag 23.03.2007
    Tutorial: Sthsimo FTP Server se perivallon Windows - gepostet von parsifal am Samstag 20.01.2007
    MIKRES AGGELIES - gepostet von verginsteel am Sonntag 06.05.2007
    fortwsh selidas - gepostet von twin am Montag 16.07.2007
    Moto Gp 2006 Champion - gepostet von Karvouniaris am Sonntag 29.10.2006
    First shoot 'em up - gepostet von fotonios am Dienstag 13.11.2007
    best football player FROM GREECE! - gepostet von NARSIS am Mittwoch 31.01.2007
    Ellhnikes Seires! - gepostet von Admin_Ntk am Montag 25.09.2006



    Ähnliche Beiträge wie "fgets(), while loops & problems.."

    gone for a while.. i guess - Nerazh (Donnerstag 06.12.2007)
    Erster Sieg in dieser Saison. - manni (Sonntag 07.12.2008)
    Fruity Loops 6.0 - The Judge (Mittwoch 04.10.2006)
    Confort ceiling light+position lights while locking - XtraStuff (Montag 02.07.2007)
    Wer hat schon mal Loops mit dem 22e geflogen? Ich !!!! :)) - tecel (Donnerstag 09.08.2007)
    If just for a while - Nearly Perfect (Samstag 27.05.2006)
    While I.. - Littlegirl764 (Sonntag 29.04.2007)
    Fragen zu Fruity Loops - Sir endless Trix (Dienstag 26.12.2006)
    bye bye for a while - Niina (Montag 03.07.2006)
    SF60V2 Loops und Rollen üben - Steffen1976 (Donnerstag 15.11.2007)