Κρασάρισμα προγράμματος ή μη

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Κρασάρισμα προγράμματος ή μη

Δημοσίευσηαπό geovoulga » 15 Νοέμ 2011, 13:49

Το παρακάτω πρόγραμμα με το DEV-C++ κρασάρει, ενώ με το CODE:BLOCKS, όχι.
Μήπως το πρόγραμμα δεν είναι σωστό, ή παίζει κάτι άλλο? Γιατί συμβαίνει αυτό? Αυτό που θέλω να κάνει αρχικά είναι να δέχεται μόνο ένα, συγκεκριμένο, χαρακτήρα από το χρήστη και μέσω της choice να κάνει διάφορες ενέργειες.
Τον παραθέτω.
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <string.h>

#define LENGTH 100+1

int get_menu_choice (void);

int main()
{
char choice = 0, t = 0;

while (1)
{
//Κλήση της συνάρτησης get_menu_choice για την εμφάνιση του main menu
choice = get_menu_choice();

while ((t = getchar()) != '\n');
{
switch (choice)
{
case 'N':
puts("You entered a valid choice.");
break;
case 'S':
puts("You entered a valid choice.");
break;
case 'U':
puts("You entered a valid choice.");
break;
case 'E':
return 0;
default:
puts("INVALID ENTRY\n");
}
}
}
}

// Δήλωση της συνάρτησης για την εμφάνιση του main menu
int get_menu_choice (void)
{
char selection[] = {'0'};
char line[] = {'0'};
int count = 0;

do
{
puts ("\nMAIN MENU\n");
puts ("\n[N] Start New Game\n");
puts ("\n[S] Score\n");
puts ("\n[U] Undo\n");
puts ("\n[E] End Program\n");
printf ("\nSelection [N, S, U, E]:");

fgets( selection, LENGTH, stdin );
sscanf( selection, "%s", line );

count = strlen (line);

if( count != 1 )
puts("\nInvalid entry,you can enter only N,S,U,E.\n");
}
while( count > 1 );

system("pause");

return line[0];
}
geovoulga
babeTUX
babeTUX
 
Δημοσιεύσεις: 3
Εγγραφή: 15 Νοέμ 2011, 12:31
Εκτύπωση

Re: Κρασάρισμα προγράμματος ή μη

Δημοσίευσηαπό simosx » 15 Νοέμ 2011, 14:05

Δοκίμασε να τρέξεις το πρόγραμμα από το τερματικό.
Μεταγλωττίζεις με

Κώδικας: Επιλογή όλων
gcc myprog.c -o myprog


και εκτελείς με
Κώδικας: Επιλογή όλων

./myprog
προσωπικό ιστολόγιο ϗ πλανήτης 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: Κρασάρισμα προγράμματος ή μη

Δημοσίευσηαπό migf1 » 15 Νοέμ 2011, 14:17

Το ότι δεν κρασάρει στο Code::Blocks είναι συμπτωματικό, έχει πρόβλημα ο κώδικας στην get_menu_choice() όπου τα strings line & selection ορίζονται με μέγιστο μήκος 1ος χαρακτήρα, αλλά παρακάτω στο selection μέσω της fgets διαβάζεις τουλάχιστον 2 χαρακτήρες (το γράμμα + ENTER) αφού της επιτρέπεις να μπορεί να διαβάζει μέχρι LENGTH-1 χαρακτήρες.

Επίσης, αυτό που θες να κάνεις μπορεί να γίνει με πολύ πιο απλό κώδικα: http://codepad.org/uYbGeyjy (με syntax-highlighting και σωστή στοίχιση). Του έχω προσθέσει τη δυνατότητα να είναι... αναίσθητο σε πεζά/κεφαλαία ;)

Χωρίς syntax-highlighting (και "χαλασμένη" στοίχιση)...
Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <ctype.h> /* for toupper() */
#include <stdlib.h> /* for system() */

#define LENGTH 100+1

int get_menu_choice( void );

int main( void )
{
char c = '\0'; /* επιλογή χρήστη */

/* το κύριο loop του προγράμματος */
do {
c = get_menu_choice(); /* εμφάνιση μενού & διάβασμα επιλογής */

switch ( c ) /* διαχείριση της επιλογής */
{
/* αν για πολλές επιλογές αντιδράμε όμοια, τις βάζουμε όλες μαζί */
case 'N':
case 'S':
case 'U':
puts("\t--- valid choice\n");
break;
case 'E':
break;
default:
puts("\t*** invalid choice\n");
break;
}

} while ( c != 'E' ); /* όσο η επιλογή διαφέρει από κεφαλαίο Ε */

system("pause");
return 0;
}

/* ------------------------------------------------------------ */
int get_menu_choice( void )
{
char line[ LENGTH ] = {'\0'}; /* για το διάβασμα γραμμής από την stdin */
char sel[ LENGTH ] = {'\0'}; /* για αποθήκευση της 1ης λέξης */

/* εμφάνιση του μενού */
puts ("MAIN MENU\n");
puts ("[N] Start New Game");
puts ("[S] Score");
puts ("[U] Undo");
puts ("[E] End Program");
printf ("\nSelection [N, S, U, E]: ");

/* διάβασμα επιλογής χρήστη */
fgets( line, LENGTH, stdin ); /* διάβασμα γραμμής από την stdin */
sscanf( line, "%s", sel ); /* αποθήκευση της 1ης λέξης της στο sel */

/* επιστροφή του 1ου χαρακτήρα, αλλαγμένου σε κεφαλαίο */
return toupper( sel[0] );
}


/* ====================== ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΟ ΑΡΧΙΚΟ ΠΡΟΓΡΑΜΜΑ ============================ */

#if 0

int get_menu_choice (void);

int main( void )
{
char choice = 0, t = 0;

while (1)
{
/* Κλήση της συνάρτησης get_menu_choice για την εμφάνιση του main menu */
choice = get_menu_choice();

while ((t = getchar()) != '\n');
{
switch (choice)
{
case 'N':
puts("You entered a valid choice.");
break;
case 'S':
puts("You entered a valid choice.");
break;
case 'U':
puts("You entered a valid choice.");
break;
case 'E':
return 0;
default:
puts("INVALID ENTRY\n");
}
}
}

system("pause");
return 0;
}

/* Δήλωση της συνάρτησης για την εμφάνιση του main menu */
int get_menu_choice (void)
{
char selection[] = {'0'};
char line[] = {'0'};
int count = 0;

do
{
puts ("\nMAIN MENU\n");
puts ("\n[N] Start New Game\n");
puts ("\n[S] Score\n");
puts ("\n[U] Undo\n");
puts ("\n[E] End Program\n");
printf ("\nSelection [N, S, U, E]:");

fgets( selection, LENGTH, stdin );
sscanf( selection, "%s", line );

count = strlen (line);

if( count != 1 )
puts("\nInvalid entry,you can enter only N,S,U,E.\n");
}
while( count > 1 );

return line[0];
}
#endif
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Κρασάρισμα προγράμματος ή μη

Δημοσίευσηαπό geovoulga » 15 Νοέμ 2011, 16:35

Για κάποιο λόγο δεν μπορούσα να μπω στη σελίδα και να απαντήσω νωρίτερα.
Όσον αφορά το θέμα μας τώρα, Θέλω να δείνει ο χρήστης μόνο τον χαρακτήρα που απαιτείται(N,S,U,E) διαφορετικά θέλω να τυπώνει μηνύματα λάθους και με αυτόν τον τρόπο να καθοδηγείται ο χρήστης για σωστή εισαγωγή, δηλαδή να δίνει μόνο N,S,U.E. Ειδικότερα, αν ο χρήστης δώσει π.χ. Νn, θέλω να δίνει μήνυμα λάθους. Σκέφτηκα για την char *s_get( char *s, int n ), θα είχε χρήση εδώ?
geovoulga
babeTUX
babeTUX
 
Δημοσιεύσεις: 3
Εγγραφή: 15 Νοέμ 2011, 12:31
Εκτύπωση


Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι