鱼C论坛

 找回密码
 立即注册
查看: 7957|回复: 24

[技术交流] scanf惹出的祸

[复制链接]
发表于 2012-8-5 07:08:37 | 显示全部楼层 |阅读模式
1鱼币
无论老鸟新鸟,肯定很少人遇到这样的事!
我在做一个无聊的表格的时候,发现的问题!请大家仔细的看看下面我给出的两段代码,并且试下,你会发现不一样的喔!
第一段代码:
#include <stdio.h>
#define SIZE 40
struct student_type
{
char name[10];
int num;
int age;
char address[15];
}stud[SIZE];
void save()
{
int i;
FILE *fp;
if( (fp=fopen("stu_list","wb"))==NULL )
{
  printf("file write error\n");
  fclose(fp);
}
for(i=0;i<SIZE;i++)
  if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
   printf("file write error\n");
  fclose(fp);
}
void printf_stud()
{
int i;
FILE *fp;
fp=fopen("stu_list","rb");
for(i=0;i<SIZE;i++)
{
  fread(&stud[i],sizeof(struct student_type),1,fp);
  printf("%s%d%d%s \n",stud[i].name, stud[i].num, stud[i].age, stud[i].address);
  fclose(fp);
}
}
void main()
{
int i;
for(i=0;i<SIZE;i++)
  scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].address);
save();
printf_stud();
}








第二段代码:
#include <stdio.h>
#define SIZE 1
struct student_type
{
char name[10];
int num;
int age;
char address[15];
}stud[SIZE];
void save()
{
int i;
FILE *fp;
if( (fp=fopen("stu_list","wb"))==NULL )
{
  printf("file write error\n");
  fclose(fp);
}
for(i=0;i<SIZE;i++)
  if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
   printf("file write error\n");
  fclose(fp);
}
void printf_stud()
{
int i;
FILE *fp;
fp=fopen("stu_list","rb");
for(i=0;i<SIZE;i++)
{
  fread(&stud[i],sizeof(struct student_type),1,fp);
  printf("%s%d%d%s \n",stud[i].name, stud[i].num, stud[i].age, stud[i].address);
  fclose(fp);
}
}
void main()
{
int i;
for(i=0;i<SIZE;i++)
  scanf("%s%d%d%s",&stud[i].name,&stud[i].num,&stud[i].age,&stud[i].address);
save();
printf_stud();
}

没错各位大部分说:这不是一模一样的代码么?仔细的朋友肯定会发现,我的第一段main函数的scanf缺少了两个&&,但是毫不影响运算结果,那肯定有其他朋友肯定说那能不能缺少其他呢?我尝试过这段代码,只能前面和后面!我很仔细的对过这两个代码的汇编代码,是基本一摸一样的!那就是说,是不是scanf这个函数就可以偷工减料去少写几个呢!请大家思考下把!


小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-5 09:22:06 | 显示全部楼层
&是取地址的运算符 。stud.name本来就是地址,所以可以不加。不过c语言规定你硬要加上&也可以……
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-5 09:46:15 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-5 11:36:09 | 显示全部楼层
汗,字符串都不加&的,数组名存放的就是一个地址
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-5 12:33:36 | 显示全部楼层
汗,楼主呀,一楼的回答是正确的,是你没有搞清楚,我并不是批评,只是说,楼主你再看看,是不是你真的搞错了,呵呵呵。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-5 15:28:48 | 显示全部楼层
4楼正解啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-5 16:06:06 | 显示全部楼层
魁拔 发表于 2012-8-5 12:33
汗,楼主呀,一楼的回答是正确的,是你没有搞清楚,我并不是批评,只是说,楼主你再看看,是不是你真的搞错 ...

请你看清楚第一个程序跟第二个程序!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-5 16:07:16 | 显示全部楼层
五月跳回家 发表于 2012-8-5 11:36
汗,字符串都不加&的,数组名存放的就是一个地址

那你不加呗!随你!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-5 16:14:02 | 显示全部楼层
红茶 发表于 2012-8-5 16:06
请你看清楚第一个程序跟第二个程序!

兄弟呀,你还是太粗心了,第二个和第三个取地址符之所以不能省略,是因为num和age不是字符串数组,是int型的整数,你还是再看看吧,如果你还不懂,我也没办法了,呵呵
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-5 18:44:00 | 显示全部楼层
红茶 发表于 2012-8-5 09:46
傻B,不懂别乱说!

我的话出自c陷阱和缺陷……
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-6 08:38:18 | 显示全部楼层
万骨空 发表于 2012-8-5 18:44
我的话出自c陷阱和缺陷……

那我就跟你说,我看的书,已经有三本是发现错误的,而且并不是一个两个小错误。你说stud.name本来就是地址,那printf("%s",stud.name);我这样打印的也是地址么?不要只顾着看书,思考也实践是很重要的,书本很多是错误,我们教授也同意这样的说法!你自己好好想把!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-6 11:58:00 | 显示全部楼层
..........
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-6 12:04:08 | 显示全部楼层
楼主你确定你的代码能直接运行吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-6 12:12:18 | 显示全部楼层
楼主,首先,不要随便骂人,即使人家说错了,但是人家也没有喷你。作为程序员,你可以攻击他的技术,但是不要进行人身攻击。。书本上是错误的很多。

但是你的那种情况没什么大惊小怪的。  就像,char * string = "HelloWorld",  这样  跟

char * string = &"HelloWord"; 同一个效果, 你加或者不加 &, 编译器都会把这个字符串的地址赋值给 变量
string.   并且你的这样的事情,学过C语言的人估计都知道,输入字符串的时候不用加&。  只是很多人都是听老师说或者看书上那样写,很少有人去试过加上 &。是什么样而已。。。

就像我前面这个例子。其实说白了,都是编译器的事情。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-6 14:02:00 | 显示全部楼层
Tzdner_C 发表于 2012-8-6 12:12
楼主,首先,不要随便骂人,即使人家说错了,但是人家也没有喷你。作为程序员,你可以攻击他的技术,但是不 ...

嘿嘿,又找到你了,也是,你太活跃了,求助的帖子总有你的回答,我这里有个问题,相信不少初学者,甚至是进阶段的都不一定能很清楚,就是指针的问题,两段小程序,我个人觉得很经典:lol
http://bbs.fishc.com/forum.php?m ... id=20581&extra=
相信这个对于你来说应该不是问题:lol
同时也希望大家都来看看,有什么见解都来说一下,交流交流。
谢谢了!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-6 14:36:07 | 显示全部楼层
Tzdner_C 发表于 2012-8-6 12:12
楼主,首先,不要随便骂人,即使人家说错了,但是人家也没有喷你。作为程序员,你可以攻击他的技术,但是不 ...

第一我没有骂人,我只是提出来OK?我后面已经写很清楚,请大家思考!我这只是建议,随你们怎么觉得
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-6 14:42:13 | 显示全部楼层
;P;P;P学下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-6 14:56:07 | 显示全部楼层
红茶 发表于 2012-8-6 14:36
第一我没有骂人,我只是提出来OK?我后面已经写很清楚,请大家思考!我这只是建议,随你们怎么觉得

你那句“傻B” 不是骂人是什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-6 15:19:05 | 显示全部楼层
/:;★纸鹤☆ 发表于 2012-8-6 14:56
你那句“傻B” 不是骂人是什么?

随你认为,你觉得是就是!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-6 16:20:04 | 显示全部楼层
LZ SB 随你认为,你觉得是骂人就是骂人!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-21 02:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表