首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

新手,老师们帮忙看看这个小程序哪出错了

2013-10-02 
新手求助,老师们帮忙看看这个小程序哪出错了感觉没错啊,怎么运行不出结果呢#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
又可以读入


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]

热点排行