新手求助,老师们帮忙看看这个小程序哪出错了感觉没错啊,怎么运行不出结果呢#includestdio.hstruct stude
新手求助,老师们帮忙看看这个小程序哪出错了
感觉没错啊,怎么运行不出结果呢
#include<stdio.h>
struct student{
int num;
char name[20];
int score;
};
struct student input()
{
struct student s;
printf("输入学号,姓名,成绩:");
scanf("%d%s%d\n",&s.num,s.name,&s.score);
return s;
}
main()
{
struct student stu1;
stu1=input();
printf("输出学号,姓名,成绩:");
printf("%d %s %d\n",stu1.num,stu1.name,stu1.score);
}
c struct
[解决办法]scanf("%d%s%d\n",&s.num,s.name,&s.score); 改为
scanf("%d%s%d",&s.num,s.name,&s.score);你必须知道的495个C语言问题》第12章标准输入输出库
scanf问题尽管scanf看起来好像不过是和printf互补的函数,但它却有许多基本的限制,有的程序员建议干脆完全避免使用它。
12.19
问:我像这样用"%d\n"调用scanf从键盘读取数字:
int n;
scanf("%d\n", &n);
printf("you typed %d\n", n);
好像要多输入一行才返回。为什么?答:可能令人吃惊,\n在scanf格式串中不表示等待换行符,而是读取并放弃连续的空白字符。(事实上,scanf格式串中的任何空白字符都表示读取并放弃空白字符。而且,诸如%d这样的格式也会扔掉前边的空白,因此你通常根本不需要在scanf格式串中加入显式的空白。)
因此,"%d\n"中的\n会让scanf读到非空白字符为止,而它可能需要读到下一行才能找到这个非空白字符。这种情况下,去掉\n仅仅使用"%d"即可(但你的程序可能需要跳过那个没有读入的换行符。参见问题12.20。)
scanf函数是设计来读取自由格式的输入的,而在读取键盘输入的时候,你所得到的往往并不是你所想要的。"自由格式"意味着scanf在处理换行符的时候跟其他的空白一样。格式"%d%d%d"既可读入
1 2 3
又可以读入
1
2
3
(比较一下就可得知,C、Pascal和LISP的源码是自由格式的,而BASIC和FORTRAN的则不是。)
如果你真的要坚持,scanf的确可以用"scanset"指令读取换行符:
scanf("%d%*[\n]", &n);
scanset尽管功能强大,但还是不能解决所有的scanf问题。参见问题12.22。
参考资料: [19, Sec. B1.3 pp. 245-246]
[35, Sec. 4.9.6.2]
[8, Sec. 7.9.6.2]
[11, Sec. 15.8 pp. 357-364]