#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 并且在写出数据时也不关心乱码,它可以正常工作
答案 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("*");}
}
如果您还有问题,请告诉我。