2010-10-21 24 views
0
#include <stdio.h> 

    int main(){ 
    int i; 
    char name[10],surname[10],id[12],dpart[20]; 
    printf("******** ID Documentation ***********\n\n\n"); 
    printf("1) What is your Name? \n"); 
    scanf("%s",&name); 
    printf("2) What is your Surname? \n"); 
    scanf("%s",&surname); 
    printf("3) What is your ID Number \n"); 
    scanf("%s",&id); 
    printf("4) What is your Department? \n"); 
    scanf("%[^\n]",&dpart); 
    system("CLS"); 
    for(i=0;i<50;i++){printf("*");}printf("\n"); 
    printf("|"); 
    for(i=0;i<48;i++){printf("%%");} 
    printf("|");printf("\n");printf("|"); 
    for(i=0;i<14;i++){printf("%%");} 
    printf(" STUDENT ID CARD ");for(i=0;i<17;i++){printf("%%");}printf("|\n");printf("|"); 
    for(i=0;i<48;i++){printf("%%");} 
    printf("|\n"); 
    printf(" //////// NAME: %6s ",name);for(i=0;i<26;i++){printf("/");}printf(" \n|");for(i=0;i<48;i++){printf("-");}printf("|\n"); 
    printf(" //////// SURNAME: %6s ",surname);for(i=0;i<23;i++){printf("/");}printf(" \n|");for(i=0;i<48;i++){printf("-");}printf("|\n"); 
    printf(" //////// ID NUMVER: %11s ",id);for(i=0;i<16;i++){printf("/");}printf(" \n|");for(i=0;i<48;i++){printf("-");}printf("|\n"); 
    printf(" //////// DEPARTMENT: %22s ",dpart);for(i=0;i<4;i++){printf("/");}printf(" \n|");for(i=0;i<48;i++){printf("-");}printf("|\n"); 
    printf("|"); 
    for(i=0;i<48;i++){printf("%%");} 
    printf("|");printf("\n"); 
    printf("|"); 
    for(i=0;i<48;i++){printf("%%");} 
    printf("|");printf("\n"); 
    printf("|"); 
    for(i=0;i<48;i++){printf("%%");} 
    printf("|");printf("\n");for(i=0;i<50;i++){printf("*");} 
    } 

J'aidais un de mes amis à faire ses devoirs. Nous devons lire les données du département plutôt que de les afficher sur une carte d'identité, mais quand il s'agit de lire le département, le programme le saute et ajoute la valeur entrée pour le numéro d'identification au département. Ps: Je sais que l'utilisation de scanf() est un très mauvais travail, mais ils n'ont pas appris autre chose, donc je ne peux pas suggérer d'utiliser sscanf pour lui Et aussi ne se soucie pas du code désordonné lors de l'écriture des données, ça marcheScanf avec des espaces ne lit pas du tout

+0

** mauvaise idée ** ... et aussi ne se soucie pas du code désordonné en le montrant aux gens qui pourraient vous aider ... – pmg

+0

le début n'est pas en désordre, c'est là que j'ai besoin d'aide, le reste fonctionne, donc c'est pourquoi je m'en fous – gkaykck

+0

to fgets ne change rien du tout – gkaykck

Répondre

2

Le problème est que vous avez une nouvelle ligne dans la mémoire tampon non consommée d'entrée. Un espace dans la chaîne de format consommera zéro ou plusieurs espaces, de sorte que vous pouvez résoudre le problème en changeant cette ligne pour inclure un espace avant le % comme indiqué:

scanf(" %[^\n]",dpart); 
+0

merci mon pote, génial: D – gkaykck

0

scanf (« % s ») prend généralement un seul mot en entrée, vous pouvez contourner cela en utilisant

scanf("%[^\n]s"), ce qui signifie que vous acceptez tous les caractères, mais \ n comme entrée.

Si cela ne fonctionne pas, utilisez des outils comme bjskishore123. Il a un exemple de l'utiliser ci-dessous.

+0

Je l'utilise déjà dans le code, mais il ne fonctionne pas, ne fonctionne pas si j'ajoute les s à la fin ou non – gkaykck

0

Vous devez utiliser fgets au lieu de scanf pour lire également les espaces.

Voici le programme de travail

#include <stdio.h> 

int main(){ 
    int i; 
    char name[10],surname[10],id[12],dpart[20]; 
    char tmpBuf[3]; 
    printf("******** ID Documentation ***********\n\n\n"); 
    printf("1) What is your Name? \n"); 
    //scanf("%s",&name); 
    fgets(name,8,stdin); 
    fgets(tmpBuf, 2, stdin); 

    printf("2) What is your Surname? \n"); 
    //scanf("%s",&surname); 
    fgets(surname,9,stdin); 
    fgets(tmpBuf, 2, stdin); 

    printf("3) What is your ID Number \n"); 
    //scanf("%s",&id); 
    fgets(id,11,stdin); 
    fgets(tmpBuf, 1, stdin); 

    printf("4) What is your Department? \n"); 
    //scanf("%[^\n]",&dpart); 
    fgets(dpart,19,stdin); 
    system("CLS"); 
    for(i=0;i<50;i++){printf("*");}printf("\n"); 
    printf("|"); 
    for(i=0;i<48;i++){printf("%%");} 
    printf("|");printf("\n");printf("|"); 
    for(i=0;i<14;i++){printf("%%");} 
    printf(" STUDENT ID CARD ");for(i=0;i<17;i++){printf("%%");}printf("|\n");printf("|"); 
    for(i=0;i<48;i++){printf("%%");} 
    printf("|\n"); 
    printf(" //////// NAME: %6s ",name);for(i=0;i<26;i++){printf("/");}printf(" \n|");for(i=0;i<48;i++){printf("-");}printf("|\n"); 
    printf(" //////// SURNAME: %6s ",surname);for(i=0;i<23;i++){printf("/");}printf(" \n|");for(i=0;i<48;i++){printf("-");}printf("|\n"); 
    printf(" //////// ID NUMVER: %11s ",id);for(i=0;i<16;i++){printf("/");}printf(" \n|");for(i=0;i<48;i++){printf("-");}printf("|\n"); 
    printf(" //////// DEPARTMENT: %22s ",dpart);for(i=0;i<4;i++){printf("/");}printf(" \n|");for(i=0;i<48;i++){printf("-");}printf("|\n"); 
    printf("|"); 
    for(i=0;i<48;i++){printf("%%");} 
    printf("|");printf("\n"); 
    printf("|"); 
    for(i=0;i<48;i++){printf("%%");} 
    printf("|");printf("\n"); 
    printf("|"); 
    for(i=0;i<48;i++){printf("%%");} 
    printf("|");printf("\n");for(i=0;i<50;i++){printf("*");} 
    } 

Faites-moi savoir si vous avez encore des problèmes.

+0

-1 "fflush (stdin)" est un comportement indéfini, voir ANSI – user411313

+0

fflush est enlevé et fgets est utilisé pour supprimer les caractères dans stdin.pourriez-vous supprimer downvote? :) – bjskishore123

1

scanf renvoie le nombre d'affectations réussies. UTILISATION QUE LA VALEUR DE RETOUR (EDIT) SUR TOUS Scanf LANCE UN APPEL

/* ... */ 
printf("1) What is your Name? \n"); 
if (scanf("%s",&name) != 1) { /* error */ printf("error on line %d.\n", __LINE__); } 
printf("2) What is your Surname? \n"); 
if (scanf("%s",&surname) != 1) { /* error */ printf("error on line %d.\n", __LINE__); } 
/* ... */