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

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

Δημοσ.

Λοιπον παμε αμεσως στο ψητο

int main(){
   
  int a,b;

 printf("Enter first number: \n "  );
 scanf("%d"  , &a);

 

 printf("Enter second number: \n "  );
 scanf("%d"  , &;


   return 0;
}

Εχω προβλημα στον παραπανω κωδικα...γενικα οσες ποιο πολλες διαδοχικες prinf-scanf βαλω τοσο πιο εντονο ειναι το προβλημα..

 

Τα ιδια γινονται και σε διαφορετικους IDE

 

Ειμαι ετοιμος να τρελαθω!

Δημοσ.

Δεν έχεις κάνει include την standard βιβλιοθήκη για Input/Output:

 

#include <stdio.h>

int main()
{
    ...
}

 

εννοειται οτι την εχω κανει απλα δεν το εγραψα εδω

 

 

 

 

Oριστε αλλο ενα προβληματικο παραδειγμα

#include<stdio.h>

int main(){

	char a ;
    char b ;
    int c;
    int d;
    int e;
    int f;


	scanf("%c" , &a);
    scanf("%c" , &;
    scanf("%d" , &c);
    scanf("%d" , &d);
    scanf("%d" , &e);
    scanf("%d" , &f);


	return 0;
}

μολις παρει το input απο την δευτερη scanf σταματαει να περνει απο τις υπολοιπες...και μολις τωρα παρατηρησα οτι αλλαζει ο τυπος

Δημοσ.

Ακόμη το πρόβλημα μπορεί να λυθεί με:

fflush(stdin);

Μετά από scanf.

 

Btw η scanf νομίζω είναι από τις κλασικές συναρτήσεις που μπορούν να προκαλέσουν buff overflow...

Δημοσ.

Ακόμη το πρόβλημα μπορεί να λυθεί με:

fflush(stdin);
Μετά από scanf.

 

Btw η scanf νομίζω είναι από τις κλασικές συναρτήσεις που μπορούν να προκαλέσουν buff overflow...

 

Χρησιμοποιώντας scanf πάντα θα έχεις κάποιο πρόβλημα.

 

Όσον αφορά το συγκεκριμένο, αυτό που προτείνεις δεν είναι λύση. Εκτός ότι δεν θα βοηθήσει τον OP, η fflush δεν πρέπει να χρησιμοποιείται έτσι (με input streams όπως το stdin). Σε Visual Studio και κάποια άλλα περιβάλλοντα θα παίξει αλλά δεν είναι σίγουρο ότι θα παίξει παντού. πχ σε linux έχουμε:

 

#include <stdio.h>

int main(void)
{
    int a = 0;

    while (a != 5) {
      scanf("%d", &a);
      printf("You entered %d\n", a);
      fflush(stdin);
      /* while (getchar() != '\n')
         continue();
      */
    }

    return 0;
}
Αποτέλεσμα:

% ./a.out 
2 19 3 4 9 
You entered 2
You entered 19
You entered 3
You entered 4
You entered 9
2 5
You entered 2
You entered 5
Όπως βλέπουμε, η fflush δεν βοήθησε. Αν χρησιμοποιηθεί η getchar (που δουλεύει παντού) όπως φαίνεται στο σχόλιο έχουμε:

% ./a.out 
2 19 3 4 9
You entered 2
2 5
You entered 2
5
You entered 5
Με την getchar γλυτώνεις από το συγκεκριμένο πρόβλημα της scanf και σου μένουν μόλις άλλα 50.
Δημοσ. (επεξεργασμένο)

@imitheos διαφωνώ στο οτι ειναι πρόβλημα. Η scanf διαβάζει ακριβως οτι της δίνεις. Αρα δεν υπάρχει καποιο προβλημα. 

 

@nik234 μην υποτιμάς τον κώδικα γιατι ακομα και στα "γελοία" μπορει να την πατήσει κάποιος. Την πατησες αρα δεν ειναι γελοίο.

 

Μπορεις να παίξεις και έτσι :

 
 
int c;
 
printf(" Give a character ");
scanf("%d" , &c);
 
while( c = getchar() != '\n' && c != EOF ) ;
 

Απλά διαβάζεις μέχρι ο χρήστης να δώσει έναν χαρακτήρα ο οποιος δεν ειναι αλλαγή της τρέχουσας γραμμής. Ο έλεγχος του while θα δωσει FALSE αρα δεν θα εκτελεσει αλλο το σώμα του που ειναι μια μονο εντολή η κενή (μονο ερωτηματικό). Αν ειχες παραπανω απο μια τοτε θα επρεπε να βάλεις αγκύλες οπως σου ειπε ο imitheos πριν.

Επεξ/σία από Star_Light
Δημοσ.

Έχεις πέσει κι εσύ 'θύμα' του line buffering (όπως η πλειοψηφία όσων χρησιμοποιούν την scanf() για να διαβάζουν την κύρια είσοδο).

 

Είναι πολύ καλύτερα να χρησιμοποιείς fgets() και κατόπιν sscanf(), όπως ειπώθηκε ήδη.

 

ΥΓ. Ένα ωραίο link για τα pitfalls του διαβάσματος της κύριας εισόδου με τις στάνταρ συναρτήσεις της C: http://home.datacomm.ch/t_wolf/tw/c/getting_input.html

  • Like 1

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

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

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

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

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

Σύνδεση

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

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