紧急求助:C语言结构体,指针,函数问题。
我有一个程序,实现输入输出,现在输出有问题,请教大家帮忙解决!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student
{
char number[7];
char name[12];
char sex;
float score[5];
}SSTU;
void operation(void);
void main()
{
operation();
}
static SSTU * input(SSTU *cp,int *pn)
{
SSTU *p;
int i, j,num=*pn;
p=(SSTU *)malloc(num * sizeof(SSTU));//动态分配num个存空间
printf( "请输入每个学生的信息:\n ");
for(i=0;i <num;i++)
{
printf( "学号: ");
scanf( "%s ",(p + i)-> number);
printf( "姓名: ");
scanf( "%s ", (p + i)-> name);
printf( "姓别(男:M, 女:F): ");
scanf( "%s ", &(p + i)-> sex);
printf( "四门功课的成绩: ");
(p + i)-> score[4] = 0.0F;
for(j = 0; j < 4; j++)
{
scanf( "%f ", &((p + i)-> score[j]));
(p + i)-> score[4] += (p + i)-> score[j] / 4.0F;
}
}
return p;
}
static SSTU * output(SSTU*p,int *pn)
{
int i,num=*pn;
for(i=0;i <num;i++)
printf( " %d\t ",(p+i)-> number);
printf( " %d\t ",(p+i)-> name);
printf( " %d\t ",(p+i)-> sex);
printf( " %f\t ",(p+i)-> score[4]);
printf( "\n ");
return p;
}
static void menu(void)
{
printf( "------------------------------\n "
"0. 录入成绩(第一项操作)\n "
"1. 输入成绩列表\n "
"2. 退出\n "
"------------------------------\n "
"请选择操作项目: ");
}
void operation(void)
{
SSTU *(*pf[])(SSTU *,int *) = {input, output};
int num, oper, *p;
printf( "请输入学生人学: ");
scanf( "%d ",&num);
while(1)
{
menu();
scanf( "%d ", &oper);
if(oper == 2) return;
if(oper > 2 || oper < 0) continue;
p = (*pf[oper])(p, &num);
}
}
[解决办法]
printf( " %d\t ",(p+i)-> number);
printf( " %d\t ",(p+i)-> name);
printf( " %d\t ",(p+i)-> sex);
—————————————————————
printf( " %s\t ",(p+i)-> number);
printf( " %s\t ",(p+i)-> name);
printf( " %c\t ",(p+i)-> sex);
[解决办法]
在输入的时候就已经错了,
楼主想通过 p+i 来得到下一组数据。可是在链表的操作中并不是这样来实现的。
关键还是在于输入的时候,如果输入的时候有问题,自然就不能正确输出,教材上讲得很清楚该如何输入,楼主再去温习一下。
[解决办法]
int num, oper, *p; //p的类型错了.
scanf( "%s ", &(p + i)-> sex);//scanf( "\n%s ", &(p + i)-> sex);要不读取的是上一行的回车符.
输出时还要判断是不是个空指针.
还有就是楼上说的输出格式.
[解决办法]
问题还是在输入那一块,链表的输入不是怎么简单的。
typedef struct person
{
int id;
char name [21];
char number [13];
struct person *next;
}inform;
inform *Creat()
{
inform *h1, *p1, *p2;
p1 = p2 = (inform *)malloc(LEN);
printf( "\nNO.%d\nUserName: ", ++n);// 先输入第一组数据
scanf( "%s ", p1-> name);
printf( "Telephone: ");
scanf( "%s ", p1-> number);
p1-> id = n;
h1 = p1;
/* 输入从第二组开始及以后的所有数据 */
for (int i=1; i <4; i++)
{
p2 = p1;
p1 = (inform *) malloc (LEN);
printf( "\nNO.%d\nUserName: ", ++n);
scanf( "%s ", p1-> name);
printf( "Telephone: ");
scanf( "%s ", p1-> number);
p1-> id = n;
p2-> next = p1;
}
p2-> next = NULL;
return h1;
}
这是一个简单的对 链表输入 的例子
楼主可以借鉴,并修改一下你自己的那个。