带空格的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("*");} 
    } 

我帮助我的一位朋友做家庭作业。我们必须阅读部门数据而不是将其显示在身份证上,但是当涉及阅读部门时,程序会跳过它并将输入的ID值添加到部门。 Ps:我知道使用scanf()是一个非常糟糕的工作,但他们没有学到别的东西,所以我不能建议对他使用sscanf 而且在写出数据时也不在乎乱码,它的工作原理是带空格的Scanf根本不读

+0

**坏主意** ...和也不关心凌乱的代码,当显示它的人可能会帮助你... – pmg 2010-10-21 17:16:49

+0

开始并不凌乱,这就是我需要帮助,其余作品,所以这就是为什么我不在乎 – gkaykck 2010-10-21 17:20:09

+0

也从scanf到fgets根本不会改变什么 – gkaykck 2010-10-21 17:22:45

的问题是,必须在输入缓冲器的未消耗的换行符。在格式字符串的空间会消耗零个或多个空白字符,这样你就可以通过改变这一行解决问题包括%前一个空间,如下所示:

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

感谢哥们,太棒了:D – gkaykck 2010-10-29 15:08:23

的scanf(“%S”)通常需要一个字作为输入,就可以解决这个问题使用

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

如果这不起作用,建议使用fgets如bjskishore123。他有一个使用它的例子。

+0

我已经在代码中使用它,但它不工作,不工作,如果我最后添加s – gkaykck 2010-10-21 17:28:36

您需要使用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("*");} 
    } 

让我知道如果你还有问题。

+0

-1“fflush(stdin)”是未定义的行为,请参见ANSI – user411313 2010-10-21 18:02:00

+0

fflush已删除,fgets是用于删除stdin中的字符。你可以删除downvote? :) – bjskishore123 2010-10-21 18:43:58

scanf返回成功分配的数量。 使用返回值(编辑)ON ALL SCANF CALLS

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