2016-11-28 5 views
0

Je dois coder un programme qui lit une liste de noms et d'identifiants d'étudiant et les trier en fonction du prénom, du nom et de l'identifiant. Mais il y a actuellement deux problèmes avec mon code.Lecture dans une liste

#include <stdio.h> 

int main() { 
    char firstName[200][21], lastName[200][51]; 
    unsigned short id[200]; // used short to decrease memory usage 
    int i; 

    for (i=0; i<200; ++i) { 
    printf("Enter first name of student %d: ",i+1); 
    getchar(); // FIX to consume enter 
    fgets(firstName[i],21,stdin); 
    printf("Enter last name of student %d: ",i+1); 
    fgets(firstName[i],21,stdin); 
    printf("Enter student number of student %d: ",i+1); 
    scanf("%hu",&id[i]); 
    printf("You've entered %s %s with ID %hu",firstName[i],lastName[i],id[i]); 
    } 

// other functions to do after reading in the data is successfully done 
} 
  1. lecture des valeurs doit être arrêté si les élèves atteignent 200 ou si l'utilisateur entre EOF.
  2. Le prénom ou le nom de l'étudiant peut être composé de plusieurs parties (quelque chose comme "john john"), donc j'ai utilisé fgets au lieu de scanf et% s pour lire le mot qui vient après l'espace. .?. stocké

Pourriez-vous me dire comment arrêter la boucle avec EOF et lire dans le premier et le dernier nom correctement Merci

+0

Avez-vous vérifié les valeurs renvoyées par votre [ 'getchar'] (http://en.cppreference.com/ w/c/io/getchar), ['fgets'] (http://en.cppreference.com/w/c/io/fgets) et [' scanf'] (http://en.cppreference.com/ w/c/io/fscanf) appels? –

+0

Sur une note non liée, vous devriez probablement lire et en apprendre davantage sur * structures *. –

Répondre

3

pour vérifier l'EOF, vous pouvez utiliser la fonction:

feof(FILE*) // if it returns 1 then it is EOF reached. 

vous pouvez l'utiliser comme le bel OW extrait:

if (feof(fp) == 1) 
break; 

et le 2ème problème:

printf("Enter last name of student %d: ",i+1); 
    fgets(firstName[i],21,stdin); // this is incorrect. 

utilisation LASTNAME 'au lieu de 'prenom'. Il devrait ressembler à ceci:

fgets(lastName[i],21,stdin); 

de cette façon vous écrasez la valeur de prenom

+0

oh thnaks droite je ne l'ai pas vu !! –

+0

Heureux d'aider mec !!!! –

+0

Il lit toujours dans les entrées. Comment pourrais-je les enlever? –