带空格的Scanf根本不读

时间:2010-10-21 17:12:15

标签: c scanf

   #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("*");}
   }

我在帮他的一个朋友做作业。我们必须阅读部门数据而不是在身份证上显示,但是当涉及阅读部门时,程序会跳过它并将为身份证号码输入的值添加到部门。 Ps:我知道使用scanf()是一项非常糟糕的工作,但他们没有学到任何其他东西所以我不能建议他使用sscanf 并且在写出数据时也不关心乱码,它可以正常工作

4 个答案:

答案 0 :(得分:2)

问题是输入缓冲区中有一个未使用的换行符。格式字符串中的空格将消耗零个或多个空白字符,因此您可以通过更改此行以在%之前包含空格来解决问题,如下所示:

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

答案 1 :(得分:1)

scanf返回成功分配的数量。 使用返回值(编辑)在所有搜索范围内

/* ... */
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__); }
/* ... */

答案 2 :(得分:0)

scanf(“%s”)通常只需一个单词作为输入,你可以使用

来解决这个问题

scanf("%[^\n]s"),这意味着您将接受任何字符,但\ n作为输入。

如果那不起作用,请使用像bjskishore123这样的建议。他有一个在下面使用它的例子。

答案 3 :(得分:0)

您还需要使用fgets而不是scanf来读取空格。

这是工作程序

 #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("*");} 
   } 

如果您还有问题,请告诉我。