一个关于scanf/printf函数的问题


#include<stdio.h>

typedef struct{
char *stu_no;//学生学号
char *stu_name;//学生姓名
float grade_one;
float grade_two;
float grade_three;
} student;

void main()
{
student stu[3];

for(int i=0;i<3;i++)
{
printf("请输入学生学号:\n");
scanf("%s",&stu[i].stu_no);
fflush(stdin);
printf("请输入学生姓名:\n");
scanf("%s",&stu[i].stu_name);
printf("请输入* %s *的课程1的成绩:\n",&stu[i].stu_name);

scanf("%f",&stu[i].grade_one);

printf("请输入* %s *的课程2的成绩:\n",&stu[i].stu_name);
scanf("%f",&stu[i].grade_two);

printf("请输入* %s *的课程3的成绩:\n",&stu[i].stu_name);
scanf("%f",&stu[i].grade_three);
}
printf("============================================================\n");
printf("学号 姓名 课程1成绩 课程2成绩 课程3成绩\n");
printf("============================================================\n");

for(int j=0;j<3;j++)
{
printf("%-8s %-8s %10.1f %10.1f %10.1f\n",&stu[j].stu_no,
&stu[j].stu_name,stu[j].grade_one,stu[j].grade_two,stu[j].grade_three);
}
}

当我输入的学号,姓名分别是001,张李三时,程序输出的姓名却只有张李没有‘三’,这是为什么?我对这对函数的用法很不熟悉,希望高手指点。

[1233 byte] By [new_new_new-阿甘] at [2008-1-9]
# 1
char *stu_no;//学生学号
char *stu_name;//学生姓名

printf("请输入学生学号:\n");
scanf("%s",&stu[i].stu_no);///去掉 &
fflush(stdin);
printf("请输入学生姓名:\n");///去掉 &
scanf("%s",&stu[i].stu_name);
# 2
楼上的办法好象不对...
lorenzo13 at 2007-10-19 > top of Msdn China Tech,C/C++,C语言...
# 3
指针弄了一个下午还是不行...还是用数组吧
#include<stdio.h>

typedef struct{
char stu_no[100];//学生学号//把指针改为用数组
char stu_name[100];//学生姓名
float grade_one;
float grade_two;
float grade_three;
} student;

void main()
{
student stu[1];

for(int i=0;i<1;i++)
{
printf("请输入学生学号:\n");
scanf("%s",&stu[i].stu_no);
printf("请输入学生姓名:\n");
scanf("%s",&stu[i].stu_name);
printf("请输入* %s *的课程1的成绩:\n",stu[i].stu_name);

scanf("%f",&stu[i].grade_one);

printf("请输入* %s *的课程2的成绩:\n",stu[i].stu_name);
scanf("%f",&stu[i].grade_two);

printf("请输入* %s *的课程3的成绩:\n",&stu[i].stu_name);
scanf("%f",&stu[i].grade_three);
}
printf("============================================================\n");
printf("学号 姓名 课程1成绩 课程2成绩 课程3成绩\n");
printf("============================================================\n");

for(int j=0;j<1;j++)
{
printf("%s %s %10.1f %10.1f %10.1f\n",stu[j].stu_no,
stu[j].stu_name,stu[j].grade_one,stu[j].grade_two,stu[j].grade_three);//好象用二级指针就不行,看看高手们怎么说
}
}

lorenzo13 at 2007-10-19 > top of Msdn China Tech,C/C++,C语言...
# 4
指针是要分配内存的
windspeaker at 2007-10-19 > top of Msdn China Tech,C/C++,C语言...
# 5
为什么不用string 类型的,char没有这个好使
VCLIFE-linux&&qt at 2007-10-19 > top of Msdn China Tech,C/C++,C语言...
# 6
这种情况是用char[]比较方便,用malloc动态分配的话最后还要free
scanf("%s",&stu[i].stu_no);改成:
scanf("%s",stu[i].stu_no);
或者scanf("%s",&stu[i].stu_no[0]);(或许会提醒你是否分配内存)

初学c的时候很喜欢这样写:
char temp[100];
for(int i=0;i<3;i++)
{
printf("请输入学生学号:\n");
scanf("%s",temp);
stu[i].stu_no = (char*)malloc(strlen(temp)+1);////最少的空间
strcpy(stu[i].stu_no,temp);//////最多的时间
...

# 7
同意楼上的~~
lorenzo13 at 2007-10-19 > top of Msdn China Tech,C/C++,C语言...
# 8
#include<stdio.h>

typedef struct{
char *stu_no;//学生学号
char *stu_name;//学生姓名
float grade_one;
float grade_two;
float grade_three;
} student;

void main()
{
student stu[3];

int y; /* used for initailize the char* */

for(int i=0;i<3;i++)
{
/*give the init address */
stu[i].stu_no = &y;
stu[i].stu_name = &y+100;

printf("请输入学生学号:\n");
scanf("%s",stu[i].stu_no);/*delete the <code>&</code> */
fflush(stdin);
printf("请输入学生姓名:\n");
scanf("%s",stu[i].stu_name);/*delete the <code>&</code> */
printf("请输入* %s *的课程1的成绩:\n",stu[i].stu_name);

scanf("%f",&stu[i].grade_one);

printf("请输入* %s *的课程2的成绩:\n",stu[i].stu_name);
scanf("%f",&stu[i].grade_two);

printf("请输入* %s *的课程3的成绩:\n",stu[i].stu_name);
scanf("%f",&stu[i].grade_three);
}
printf("============================================================\n");
printf("学号 姓名 课程1成绩 课程2成绩 课程3成绩\n");
printf("============================================================\n");

for(int j=0;j<3;j++)
{
printf("%-8s %-8s %10.1f %10.1f %10.1f\n",stu[j].stu_no,
stu[j].stu_name,stu[j].grade_one,stu[j].grade_two,stu[j].grade_three);
}
}

I wish you can solve this problem with the pointer, not array! :)
DaySummer-Days at 2007-10-19 > top of Msdn China Tech,C/C++,C语言...
# 9
stu[i].stu_no = &y;
stu[i].stu_name = &y+100;

//这两句不能这样子赋值.类型不一样.要不就得把上面的
//int y; 改成 char y;
xhwen at 2007-10-19 > top of Msdn China Tech,C/C++,C语言...