user-0 提问: 用结构体数组实现学生管理系统

回复:
user: user-1
content: 在int ret=scanf("%s%d%d",a[i].name,&a[i].num,&a[i].score);后边加个fflush(stdin);试试

user: user-0
content: 引用 12 楼 cfjtaishan 的回复:[quote=引用 11 楼 yx_uu 的回复:] [quote=引用 9 楼 cfjtaishan 的回复:] [quote=引用 6 楼 yx_uu 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] 从你输入的格式来看，是你输入的数据和变量接收的数据类型不匹配导致的。 第一组输入的没问题，第二组，num是int怎么接收“ihf”呢。 scanf是格式化输入，所以你必须按照数据类型有格式的输入。  对啊，我知道这么输是错误的，输入错误数据是为了检测是否能够返回正确的ret值，但是你看，输入sojf ihf ishf的话，应该只有一个是正确格式的输入，返回1，结果运行出来是1 1 1，问题是为什么会返回三次呢？还有输入sjf sfj sof的话，运行结果是2 1 1，多出来的两次该怎么解释呢？是while循环有问题吗？但是整个运行的结果是正确的啊？ ,[/quote] 因为你输入的都是字符串，所以只与name匹配，三个字符串匹配3次[/quote] ？什么意思？输入的3个都是字符串，只有一个匹配上，就返回1嘛，多出的两个1是又在和后两个字符串匹配？[/quote] 对，这个可以打印一下name看一下，是不是匹配了。[/quote]  怎么感觉更懵逼了？

user: user-2
content: 引用 11 楼 yx_uu 的回复:[quote=引用 9 楼 cfjtaishan 的回复:] [quote=引用 6 楼 yx_uu 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] 从你输入的格式来看，是你输入的数据和变量接收的数据类型不匹配导致的。 第一组输入的没问题，第二组，num是int怎么接收“ihf”呢。 scanf是格式化输入，所以你必须按照数据类型有格式的输入。  对啊，我知道这么输是错误的，输入错误数据是为了检测是否能够返回正确的ret值，但是你看，输入sojf ihf ishf的话，应该只有一个是正确格式的输入，返回1，结果运行出来是1 1 1，问题是为什么会返回三次呢？还有输入sjf sfj sof的话，运行结果是2 1 1，多出来的两次该怎么解释呢？是while循环有问题吗？但是整个运行的结果是正确的啊？ ,[/quote] 因为你输入的都是字符串，所以只与name匹配，三个字符串匹配3次[/quote] ？什么意思？输入的3个都是字符串，只有一个匹配上，就返回1嘛，多出的两个1是又在和后两个字符串匹配？[/quote] 对，这个可以打印一下name看一下，是不是匹配了。

user: user-0
content: 引用 9 楼 cfjtaishan 的回复:[quote=引用 6 楼 yx_uu 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] 从你输入的格式来看，是你输入的数据和变量接收的数据类型不匹配导致的。 第一组输入的没问题，第二组，num是int怎么接收“ihf”呢。 scanf是格式化输入，所以你必须按照数据类型有格式的输入。  对啊，我知道这么输是错误的，输入错误数据是为了检测是否能够返回正确的ret值，但是你看，输入sojf ihf ishf的话，应该只有一个是正确格式的输入，返回1，结果运行出来是1 1 1，问题是为什么会返回三次呢？还有输入sjf sfj sof的话，运行结果是2 1 1，多出来的两次该怎么解释呢？是while循环有问题吗？但是整个运行的结果是正确的啊？ ,[/quote] 因为你输入的都是字符串，所以只与name匹配，三个字符串匹配3次[/quote] ？什么意思？输入的3个都是字符串，只有一个匹配上，就返回1嘛，多出的两个1是又在和后两个字符串匹配？

user: user-3
content: scanf并不是立即读取输入存放到变量中，而是先放到缓冲区，当按下回车键后，再对缓冲区进行处理。这是我在另一个帖子中看到的，觉得可以解决你的问题。

user: user-2
content: 引用 6 楼 yx_uu 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] 从你输入的格式来看，是你输入的数据和变量接收的数据类型不匹配导致的。 第一组输入的没问题，第二组，num是int怎么接收“ihf”呢。 scanf是格式化输入，所以你必须按照数据类型有格式的输入。  对啊，我知道这么输是错误的，输入错误数据是为了检测是否能够返回正确的ret值，但是你看，输入sojf ihf ishf的话，应该只有一个是正确格式的输入，返回1，结果运行出来是1 1 1，问题是为什么会返回三次呢？还有输入sjf sfj sof的话，运行结果是2 1 1，多出来的两次该怎么解释呢？是while循环有问题吗？但是整个运行的结果是正确的啊？ ,[/quote] 因为你输入的都是字符串，所以只与name匹配，三个字符串匹配3次

user: user-2
content: 从你输入的格式来看，是你输入的数据和变量接收的数据类型不匹配导致的。 第一组输入的没问题，第二组，num是int怎么接收“ihf”呢。 scanf是格式化输入，所以你必须按照数据类型有格式的输入。

user: user-0
content: int main()  16 {  17     //struct array  18     st a[M];  19     //get student information  20     int i=0;  21     while(i<M)  22     {  23         //scanf会返回成功匹配的字符个数，int型  24         int ret=scanf("%s%d%d",a[i].name,&a[i].num,&a[i].score);  25 //      printf("%d\n",ret);  26         if(3!=ret)  27             break;  28         i++;  29     }  30     //search student  31     char buf[100];  32     printf("input search information:\n");  33     gets(buf);  34     for(i=0;i<M;i++)  35     {  36         if(0==strcmp(a[i].name,buf))  37         {  38             printf("information:%s,%d,%d\n",a[i].name,a[i].num,a[i].score);  39         }  40     }  41 }  为什么执行不到gets(buf)？  root@ubuntu:~/cc# ./a.out  aaa 122 12 bbb 223 234 ccc 234 43 s osjf os input search information: root@ubuntu:~/cc# vim struct_arr.c

user: user-0
content: 引用 5 楼 fight_in_dl 的回复:int ret=scanf("%s%d%d",a[i].name,&a[i].num,&a[i].score);  %s格式字符串会将终端输入都作为字符串接收到a[i].name中。 解决办法是分开输入：  printf("please input name:\n"); scanf("%s",a[i].name);  printf("please input num:\n"); scanf("%d",&a[i].num);  printf("please input score:\n"); scanf("%d",&a[i].score); ”%s”不是遇到空格换行等转义字符不读入？ 我这里主要是为了获取正确输入的字符数返回ret来控制跳出循环，就说设置的最大值是输100个数据，但测试的时候输不了这么多，不想输的时候直接跳出来执行下一步，而不是直接Ctrl+c结束程序，不清楚为什么输错之后ret值会返回好几个？

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:从你输入的格式来看，是你输入的数据和变量接收的数据类型不匹配导致的。 第一组输入的没问题，第二组，num是int怎么接收“ihf”呢。 scanf是格式化输入，所以你必须按照数据类型有格式的输入。  对啊，我知道这么输是错误的，输入错误数据是为了检测是否能够返回正确的ret值，但是你看，输入sojf ihf ishf的话，应该只有一个是正确格式的输入，返回1，结果运行出来是1 1 1，问题是为什么会返回三次呢？还有输入sjf sfj sof的话，运行结果是2 1 1，多出来的两次该怎么解释呢？是while循环有问题吗？但是整个运行的结果是正确的啊？ ,

user: user-4
content: int ret=scanf("%s%d%d",a[i].name,&a[i].num,&a[i].score);  %s格式字符串会将终端输入都作为字符串接收到a[i].name中。 解决办法是分开输入：  printf("please input name:\n"); scanf("%s",a[i].name);  printf("please input num:\n"); scanf("%d",&a[i].num);  printf("please input score:\n"); scanf("%d",&a[i].score);

user: user-0
content: 如果不用键盘输入，将数据存到文件中直接读取怎么办？重定向到文件吗？要怎么实现？

user: user-0
content: printf("%d\n",ret);  26         if(3!=ret)  27             break;  28         i++;  结果又是对的，，，，？？ root@ubuntu:~/cc# ./a.out  aaa 111 90 3 bbb 222 98 3 ccc s suh 1 root@ubuntu:~/cc# vim struct_arr.c

user: user-0
content: ，，，，又试了下，怎么感觉越来越扯了？scanf返回的值有问题？ root@ubuntu:~/cc# ./a.out  sojf 394 33 3 sojf isj 29 1  sjf sfj sof 2 1 1 sojf osjf w9 1 1 1 398 hfu 89 2