2017-12-03 238 views
0

所以我想建立一个简单的程序来输入使用结构的数据。结构阵列;输入多个字符串

我原来的计划是这样的:

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

struct student { 
    int num; 
    char name[20]; 

}; 

int main() 
{ 
    int size, i; 
    scanf("%d", &size); 
    struct student s[size]; 
    for(i=0; i < size; i++){ 
     scanf("%d", &s[i].num); 
     scanf("%s", &s[i].name); 

    } 

    for(i=0; i < size; i++){ 
     printf("no.:%d\n", s[i].num); 
     printf("name:%s\n", s[i].name); 

    } 

    return 0; 
} 

我的测试输入是:

2 
1 Name1 
2 Name2 

这是工作,但只有当输入正确的数据。 但是当我尝试在我的结构中使用更多的字符串时,它开始变得混乱。例如这样的事情是行不通的:

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

struct student { 
    int num; 
    char name[20]; 
    char gender; 
    char address[20]; 
}; 

int main() 
{ 
    int size, i, j; 
    scanf("%d", &size); 
    struct student s[size]; 
    for(i=0; i < size; i++){ 
     scanf("%d", &s[i].num); 
     scanf("%s", s[i].name); 
     scanf("%s", s[i].gender); 
     scanf("%s", s[i].address); 
    } 

    for(i=0; i < size; i++){ 
     printf("no.:%d\n", s[i].num); 
     printf("name:%s\n", s[i].name); 
     printf("gender:%s\n", s[i].gender); 
     printf("address:%s\n", s[i].address); 
    } 

    return 0; 

}

我明白,所以我试图用的getchar这个问题必须躺在scanf函数的使用字符串输入()。我认为这样的事情可能会奏效。

for(i=0; i < size; i++){ 
     int j=0; 
     while((s[i].name[j]=getchar()) != ' '); 
      j++; 
     s[i].name[j] = '\0'; 
} 

虽然它不工作。在这一点上,我感到困惑,我不确定有什么问题。我的意思是我想输入的东西,如:使用结构

1001杰夫中号No.2_road_city

,但我感到困惑应该如何准确完成。

+1

启用警告是第一个步骤之前,请在计算器'的scanf( “%s” 时,与S [I] scanf(“%s”,&s [i] .gender);'='scanf(“%s”,s [i] .name);'...和其他微不足道的错误。 >'scanf(“%c”,&s [i] .ge nder);'etc – Stargateur

+1

检查每个'scanf()'调用以确保它返回正确的数字(每次读取一个字段时为1)。如果它不返回1,则说明你有问题。将N个呼叫合并为一个可能会更好 - 您可以这样做。用['fgets()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html)或POSIX ['getline()'](http:/ /pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html),然后用'sscanf()'处理该行。 –

回答

-1

fflush(stdin); 使用的scanf(“%S” .... 它清除键盘缓冲区之前。两个连续的scanf语句,而不刷新缓冲区使第二成包含来自第一输入一个新行/回车只有

另一个问题:。你用scanf("%s"一个字符变量(CHAR性别)更改为scanf("%c",&s[i].gender);

+0

'fflush(stdin);'是未定义的行为。 – Stargateur

+0

不完全如此。阅读本文(最新发布)https://stackoverflow.com/questions/2979209/using-fflushstdin –

+0

“标准C和POSIX将fflush(stdin)留作未定义行为”,这是完全正确的。 – Stargateur