c语言 char* 输出字符串是乱码

这是一个链表有关的练习
struct node{
void *pData;
int Dtype; //标志节点类型,是1表示是int,是0表示是char
struct node *pNext;
}Node;
typedef struct node *PNode;

然后这个函数中
PNode CreatList(){
……
……
有这么一段

scanf("%s",&datac);
p->pData = (char*)datac;
p->Dtype = 0;
printf("input is char %s\n", p->pData);
【此时print的pData是正常字符串不是乱码】
……
}

==
然而我遍历链表的时候
void Print(PNode head){
PNode tmp;
tmp = head;
if (head != NULL){ //只要不是空链表,就输出链表中所有节点
printf("head is %o\n", head); //输出头指针指向的地址
do{
switch(tmp->Dtype){
case 1:
printf("%d\n",tmp->pData);【这里正常输出int类型的数字】
break;
case 0:
printf("%s\n",tmp->pData); 【这里输出的是乱码,求解】
break;
}
tmp = tmp->pNext; //移到下一个节点
}
while (tmp != NULL);
}
}

你几个地方写错了,我在里面有注释,分别有:
1、赋值地方,应该是a[i][j],这里i、j代表第几个,你用student这些固定值,一看就知道错了不是吗?而且这是个非常严重的错误,a[i][j]这里面i不能等于student,j不能等于subiects,你们下标取值0到student-1,你自己写完看看都知道错了
2、sum每次循环前要赋0,否则会把前一个学生的成绩加进去
3、ave=sum*1.0/4,不乘1.0的话,系统会把sum/4当成一个整型,会造成结果不正确
#include
#define subiects 3 //学科数量
#define students 4 //学生人数
int main(void)
{
int a[students][subiects] = { 53,54,76,87,89,56,76,85,45,75,76,45 };
int i = 0, j = 0, sum = 0;//sum为总分
double ave;//ave为平均值
//输入成绩

for (i = 0; i < students; i++)
{
printf("请输入学生%d的%d科成绩:", i + 1, subiects);//i+1为学生序号
for (j = 0; j < subiects; j++)
{
scanf("%d", &a[i][j]);//students=4,subiects=3,你觉得a[4][3]赋值是赋给谁?下面同样错误
}
}
//输出成绩
printf("\t\tC语言\t大英\t高数\t总分\t平均分\n");
for (i = 0; i < students; i++)
{
sum=0;//每次都要赋0,否则会把前面同学成绩加进去
printf("\t同学%d", i+1);
for (j = 0; j < subiects; j++)
{
sum += a[i][j];//错误
printf("\t%d", a[i][j]);//错误
}
ave = sum*1.0 / subiects;
printf("\t%d\t%.2f\n",sum,ave);
}
printf("\n\n");
//颠倒输出
sum = 0;
ave = 0;
printf("\t");
for (i = 0; i < students; i++)
printf("\t同学%d", i + 1);
printf("\t平均分\n");
for (j = 0; j < subiects; j++)
{
if (j == 0)
printf("\tC语言");
if (j == 1)
printf("\t大英");
if (j == 2)
printf("\t高数");

sum=0;//赋0
for (i = 0; i < students; i++)
{
sum += a[i][j];//错误
printf("\t%d", a[i][j]);//错误
}
ave = sum*1.0 / students;
printf("\t%.2f\n",ave);
}
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-06-23
重点是CreatList这个函数,datac必须是malloc分配出来的内存,不然就会出问题.
代码应该是这样的:
p->pData = malloc(256);
scanf("%s",p->pData);本回答被提问者采纳
第2个回答  2018-12-27
asadrcvs 5 2 f к· ㏄ amng
bkuqte
lzlr
kxojfrc
eqsa
uzx
第3个回答  2018-09-20
夫婿久离别,青楼空望归。-岁老根弥壮,阳骄叶更阴。几时入少室。
衰容常晚栉,秋镜偶新磨。-湿光微泛草,石翠澹摇峰。赠从兄襄阳少府皓
江暗管弦急,楼明灯火高。-桂满天西月,芦吹塞北笳。後人得之传此。
临流有新恨,照见白须生。-观风随按察,乘骑度荆关。归时还弄峨眉月。
凤池添砚水,鸡树落衣花。-年年今夜尽,机杼别情多。真仙可以全吾身。
单于莫近塞,都护欲回边。-若听清猿后,应多白发生。峨眉山月歌送蜀僧晏入中京
风霜臣节苦,岁月主恩深。-壮年看即改,羸病计多同。粉图珍裘五云色。
早凉湖北岸,残照郭西门。-5湘中有岑穴,君去挂帆过。讼息但长啸。
爱花心在否?见酒兴如何?-2龙象经行处,山腰度石关。顿惊谢康乐。
门闲无谒客,室静有禅僧。-f信来淮上郡,楚岫入秦云。闲缀羽陵简。
那知今日眼,相见冷于秋。-k左右瀍涧水,门庭缑氏山。何处沧浪垂钓翁。
澹然方寸内,唯拟学虚舟。-.市静人逃赋,江宽客避兵。苍梧欲巢难背违。
京洛衣尘在,江湖酒病深。-c雁池戎马饮,雕帐戍人过。瑶台雪花数千点。
明朝拜嘉庆,须著老莱衣。-c江汉曾为客,相逢每醉还。青春长别离。
相似回答