Προσπέραση scanf χωρίς καμία είσοδο  Το θέμα επιλύθηκε

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

Προσπέραση scanf χωρίς καμία είσοδο  Το θέμα επιλύθηκε

Δημοσίευσηαπό linuxs » 24 Μάιος 2011, 19:53

Καλησπέρα παιδιά! Τι κάνουμε; ;)

Πολλές φορές δεν έχω τι να κάνω και είπα να θυμηθώ τα παλιά, έτσι έκανα ένα προγραμματάκι και το παραθέτω παρακάτω:
Κώδικας: Επιλογή όλων

/********************************************************************************
Άνοιγμα ενός αρχείου txt που επιλέγει ο χρήστης και εκτύπωση των αποτελεσμάτων.
Για να αρχίσει να εκτελείτε το πρόγραμμα θα πρέπει ο χρήστης να το εκτελέσει,
δίνοντας μαζί και τo αρχείο που θέλει να διαβάσει!
********************************************************************************/

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

int main(int argc, char *argv[]) {
FILE *infile;
char buf[64];
char var, var2;
printf("\n");
infile = fopen(argv[1],"r");
if(infile == NULL) {
printf("Error in file open. The %s file does not exist!\nPlease try again typing: ./a.out <filename>.\n", argv[1]);
exit(1);
}else{
printf("File %s has opened!\n", argv[1]);
printf("If you want to continue and see the content type [y/Y]:");
scanf("%c", &var);
}

if(var == 'y' || var=='Y') {
while(fgets(buf, 64, infile) != NULL) {
puts(buf);
}
}else{
printf("Program exited correctly!\nThank you for using it!;)");
}
printf("If you want to clear the screen type [y/Y]:");
scanf("%c", &var);
if(var2=='y' || var2=='Y') {
printf("\033[H\033[J");
return 0;
}else{
return 0;
}
}


Το πρόβλημά μου λοιπόν είναι οτι το δεύτερο scanf() δεν ενεργοποιείται...με άλλα λόγια μετα το προτελευταίο printf κάνει έξοδο το πρόγραμμα. Κάτι που δεν θέλω. Τρέξτε το να δείτε...
Καμια ιδέα;

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

Δημοσίευσηαπό medigeek » 24 Μάιος 2011, 22:09

Εμ.. την πρώτη φορά εισάγουμε ένα χαρακτήρα και enter.
Το δεύτερο scanf διαβάζει το δευτερο χαρακτήρα buffer του standard input, δηλαδή το enter.

Το πρόβλημα λύνεται με την ακόλουθη εντολη μετά από κάθε εντολή scanf
Κώδικας: Επιλογή όλων
getchar();
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Προσπέραση scanf χωρίς καμία είσοδο

Δημοσίευσηαπό linuxs » 25 Μάιος 2011, 23:08

medigeek έγραψε:Εμ.. την πρώτη φορά εισάγουμε ένα χαρακτήρα και enter.
Το δεύτερο scanf διαβάζει το δευτερο χαρακτήρα buffer του standard input, δηλαδή το enter.

Το πρόβλημα λύνεται με την ακόλουθη εντολη μετά από κάθε εντολή scanf
Κώδικας: Επιλογή όλων
getchar();


είναι απόλυτα σωστό? αν θέλω να διαβάσω "ya" η getchar() θα πάρει το a και θα διαβάσει \n πάλι... ;(
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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: Προσπέραση scanf χωρίς καμία είσοδο

Δημοσίευσηαπό medigeek » 25 Μάιος 2011, 23:38

Δοκίμασε το. :)

Κι αν θέλεις να καθαρίσουμε λίγο τον κώδικα:
Κώδικας: Επιλογή όλων
/********************************************************************************
Άνοιγμα ενός αρχείου txt που επιλέγει ο χρήστης και εκτύπωση των αποτελεσμάτων.
Για να αρχίσει να εκτελείτε το πρόγραμμα θα πρέπει ο χρήστης να το εκτελέσει,
δίνοντας μαζί και τo αρχείο που θέλει να διαβάσει!
********************************************************************************/

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

int main(int argc, char *argv[]) {
FILE *infile;
char ch;
char var, var2;
printf("\n");
infile = fopen(argv[1],"r");

if (infile == NULL) {
printf("Error in file open. The %s file does not exist!\nPlease try again typing: ./a.out <filename>.\n", argv[1]);
exit(1);
}
else {
printf("File %s has opened!\n", argv[1]);
printf("If you want to continue and see the content type [y/Y]:");
scanf("%c", &var);
getchar();
}

if (isupper(var)) { var = tolower(var); }
if (var == 'y') {
while((ch = fgetc(infile)) != EOF) {
printf("%c", ch);
}
}
else {
printf("Program exited correctly!\nThank you for using it!;)\n");
exit(0);
}

printf("If you want to clear the screen type [y/Y]:");
scanf("%c", &var2);
getchar();

if (isupper(var2)) { var2 = tolower(var2); }
if (var2 == 'y') {
printf("\033[H\033[J");
}
return 0;
}


Κάπου διάβασα ότι το puts() δεν είναι και ό,τι καλύτερο -- δε βρήκα να λένε κάτι κακό για τον τρόπο που έθεσα πιο πανω
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Προσπέραση scanf χωρίς καμία είσοδο

Δημοσίευσηαπό linuxs » 26 Μάιος 2011, 01:11

όχι! κακό δεν είναι...απλά η θεωρία που ανέφερα είναι σωστή. ναι μεν παίζει το getchar αλλα κάτι της λείπει....θέλει λίγο ψάξιμο ακόμη! ;)
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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: Προσπέραση scanf χωρίς καμία είσοδο

Δημοσίευσηαπό medigeek » 26 Μάιος 2011, 16:05

Εννοείς πρέπει να απορριφθεί το υπόλοιπο standard input;
Κώδικας: Επιλογή όλων
while (c != '\n' && c != EOF) { c = fgetc(stdin); }

Το βρήκα στο http://www.gnu.org/software/libc/manual ... cter-Input

Κώδικας: Επιλογή όλων
/********************************************************************************
Άνοιγμα ενός αρχείου txt που επιλέγει ο χρήστης και εκτύπωση των αποτελεσμάτων.
Για να αρχίσει να εκτελείτε το πρόγραμμα θα πρέπει ο χρήστης να το εκτελέσει,
δίνοντας μαζί και τo αρχείο που θέλει να διαβάσει!
********************************************************************************/

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

int main(int argc, char *argv[]) {
FILE *infile;
char ch;
int c, var, var2;
printf("\n");
infile = fopen(argv[1],"r");

if (infile == NULL) {
printf("Error in file open. The %s file does not exist!\nPlease try again typing: ./a.out <filename>.\n", argv[1]);
exit(1);
}
else {
printf("File %s has opened!\n", argv[1]);
printf("If you want to continue and see the content type [y/Y]:");
//scanf("%c", &var);
c = getchar();
var = c;
while (c != '\n' && c != EOF) { c = fgetc(stdin); }
}

if (isupper(var)) { var = tolower(var); }
if (var == 'y') {
while((ch = fgetc(infile)) != EOF) {
printf("%c", ch);
}
}
else {
printf("Program exited correctly!\nThank you for using it!;)\n");
exit(0);
}

printf("If you want to clear the screen type [y/Y]:");
//scanf("%c", &var2);
c = getchar();
var2 = c;
while (c != '\n' && c != EOF) { c = fgetc(stdin); }

if (isupper(var2)) { var2 = tolower(var2); }
if (var2 == 'y') {
printf("\033[H\033[J");
}
return 0;
}


Ερώτηση: Γιατί δουλεύει το δεύτερο getchar() τότε; Το δοκίμασα και αφαιρεί όλους τους επακόλουθους χαρακτήρες. -- Άκυρο δε δουλεύει. :P
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Προσπέραση scanf χωρίς καμία είσοδο

Δημοσίευσηαπό simosx » 26 Μάιος 2011, 16:08

Η πηγή του προβλήματος είναι ότι θέλεις να έχεις «getch()» που υπάρχει σε MSDOS/Windows.
Η λύση του προβλήματος είναι να χρησιμοποιήσεις το σωστό εργαλείο για getch(), και το βρίσκεις με αναζήτηση στο διαδίκτυο για «getch linux».
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Προσπέραση scanf χωρίς καμία είσοδο

Δημοσίευσηαπό linuxs » 26 Μάιος 2011, 16:18

simosx έγραψε:Η πηγή του προβλήματος είναι ότι θέλεις να έχεις «getch()» που υπάρχει σε MSDOS/Windows.
Η λύση του προβλήματος είναι να χρησιμοποιήσεις το σωστό εργαλείο για getch(), και το βρίσκεις με αναζήτηση στο διαδίκτυο για «getch linux».


Δεν πολυκατάλαβα τι θέλεις να πείς... :/ Δηλαδή? Το πρόβλημα μου δεν έχει καμια σχέση με windows...
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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: Προσπέραση scanf χωρίς καμία είσοδο

Δημοσίευσηαπό medigeek » 26 Μάιος 2011, 16:24

linuxs έγραψε:Το πρόβλημα μου δεν έχει καμια σχέση με windows...

Εννοεί ότι το msvc (microsoft c++ compiler) έχει μια εντολή getch() (τώρα μετονομάστηκε σε _getch), η οποία παίρνει μόνο τον πρώτο χαρακτήρα και αγνοεί το υπολοιπο input (αν κατάλαβα καλά):
http://wesley.vidiqatch.org/code-snippe ... -on-linux/
Τελευταία επεξεργασία από medigeek και 26 Μάιος 2011, 16:27, έχει επεξεργασθεί 1 φορά/ες συνολικά
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Προσπέραση scanf χωρίς καμία είσοδο

Δημοσίευσηαπό medigeek » 26 Μάιος 2011, 16:25

Ερώτηση: Αν χρησιμοποιήσω
Κώδικας: Επιλογή όλων
int c, var, var2;

ή
Κώδικας: Επιλογή όλων
char c, var, var2;


Το αποτέλεσμα είναι το ίδιο. Ποιο είναι το σωστό; Ή είναι τα ίδια; :?
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Επόμενο

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