2016-09-28 2 views
1

Qu'est-ce qui ne va pas dans ce programme? J'essaye de comprendre depuis 2 jours mais aucune aide du tout !! La sortie de chaîne est seulement après la saisie de chaîne et après avoir choisi le choix, la chaîne de caractères par défaut est le nouveau caractère de ligne par défaut je suppose. En plus, si je tape string lors de la saisie d'un choix, il me montre le nom affiché par défaut. Voici mon code:Impossible de saisir correctement la chaîne dans gcc ubuntu linux

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

struct marks { 
    char subject[15]; 
    int mark; 
}; 
struct student { 
    char name[10]; 
    int roll; 
    struct marks m[3]; 
}; 
void displayData(struct student); 
int displayChoice(); 
struct student getNewRecord(); 
int main() { 
    struct student s[5]; 
    int count = 0; 
    int choice; 
    do{ 
     choice = displayChoice(); 
     if(choice == 1){ 
      s[count] = getNewRecord(); 
      count ++; 
     } 
     else if(choice == 4) 
      break; 
     else 
      printf("Invalid choice"); 
    }while(1); 
} 
struct student getNewRecord() { 
    struct student temp; 
    printf("Enter your Name : "); 
    fgets(temp.name, 10,stdin ); 
    printf("Your name is : %s",temp.name); 
    return temp; 

} 
int displayChoice() { 
    int choice; 
    printf("\n\nPlease select your choice :\n"); 
    printf("1. Add new Record\n"); 
    printf("2. Display All data \n"); 
    printf("3. Remove last Record\n"); 
    printf("4. Exit the program\n"); 
    printf("What is your choice : \n"); 
    scanf("%d", &choice); 
    return choice; 
} 
void displayData(struct student s){ 
    printf("Your name : %s", s.name); 
} 

Et voici quelques captures d'écran: enter image description here

Je ne sais pas et n'a pas la moindre idée de ce qui se passe mal. Aidez-moi s'il vous plaît .. Merci d'avance ..

+0

solution la plus simple: 'char factice; scanf ("% d% c", & choice, & dummy); 'Votre' scanf' lit la valeur de l'entier et laisse la voiture '' \ n'' (la valeur ASCII de la touche enter keyboard) dans le tampon 'stdin'. Il faut donc le mettre en bobine avant de lire quelque chose de nouveau. – LPs

+0

Il a résolu le premier problème. Lorsque je sais saugat pour le choix, il affiche la sortie montrant votre nom est saugat .. comment puis-je le réparer? – user3213732

+0

Je ne vous comprends pas. Pourriez-vous élaborer? Votre code est supposé sortir 'printf (" Votre nom est:% s ", temp.name);' juste après que le nom soit entré. – LPs

Répondre

0

Vous avez des problèmes dans votre code:

  1. scanf laisser le '\n' ombles dans stdin et le prochain appel à une fonction qui STDIN sort immédiatement en raison à ce personnage.
  2. Vous devez vérifier la valeur de retour de scanf pour être sûr que l'utilisateur a entré un nombre valide. Ne pas utiliser l'ancienne déclaration de fonction de style avec des paramètres vides. Si aucun paramètre n'est requis, utilisez (void)
  3. Votre boucle principale sans fin doit prendre en charge la taille de tableau s.

Vous pouvez ajouter une fonction vide pour stdin comme:

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

struct marks { 
    char subject[15]; 
    int mark; 
}; 

struct student { 
    char name[10]; 
    int roll; 
    struct marks m[3]; 
}; 

void displayData(struct student); 
int displayChoice(void); 
struct student getNewRecord(); 
void flush_stdin(void); 

int main(void) 
{ 
    struct student s[5]; 
    size_t count = 0; 
    int choice; 

    do{ 
     choice = displayChoice(); 

     if(choice == 1) 
     { 
      s[count] = getNewRecord(); 
      count ++; 
     } 
     else if(choice == 4) 
      break; 
     else 
      printf("Invalid choice"); 
    } 
    while ((count < sizeof(s)/sizeof(s[0])) && (choice != 4)); 
} 

struct student getNewRecord(void) 
{ 
    struct student temp; 

    printf("Enter your Name : "); 

    scanf("%s", temp.name); 

    printf("Your name is : %s", temp.name); 

    flush_stdin(); 

    return temp; 
} 

int displayChoice(void) { 
    int choice; 

    printf("\n\nPlease select your choice :\n"); 
    printf("1. Add new Record\n"); 
    printf("2. Display All data \n"); 
    printf("3. Remove last Record\n"); 
    printf("4. Exit the program\n"); 
    printf("What is your choice : \n"); 

    if (scanf("%d", &choice) != 1) 
    { 
     choice = 99; 
    } 

    flush_stdin(); 

    return choice; 
} 

void displayData(struct student s) 
{ 
    printf("Your name : %s", s.name); 
} 

void flush_stdin(void) 
{ 
    int c; 
    while (((c = getchar()) != '\n') && (c != EOF)); 
} 
+1

Désolé, j'ai déclenché sur le nom, n'a pas lu le code. Mon 5ct: Je préfère en fait e, g, "drop" ou similaire ("emtpy" va bien, aussi). – Olaf

+0

Sur quelle base, priez-vous, avez-vous, quel que soit * vous *, baissé ce code? À l'exception du retour oublié de «main» nous irions dans le territoire nitpicking assez rapidement et les lentes ne sont pas de bonnes raisons pour une downvote, ou sont-ils? – deamentiaemundi

+0

@deamentiaemundi Je m'en fous. Hater va détester;). – LPs