Το ότι δεν κρασάρει στο 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