工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2929|回复: 15

我的C程序有时正常又有时输出乱码(已解决)

[复制链接]
发表于 2007-1-18 17:07 | 显示全部楼层 |阅读模式
我的C程序有时正常又有时输出乱码,为什么?
几日前搞好的C课程设计(当时没问题),刚才试了试,有时会输出乱码。如果老师看的时候乱码就惨啦,大家试过吗?

感谢 毛啦啦的提点。creat函数是改书本例子的。
可是为什么会有时正常呢?



代码:
#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
  long num;
  char name[10];
  float mat,eng,com,sum,aver;
  struct student *next;
};
int n;
struct student *head=NULL;
struct student *creat(void)
{
  struct student *p1,*p2;
  n=0;
  clrscr();
  printf("*************************CREAT*******************************\n");
  printf("(if you finish inputting,please input name=0)\n\n");
  p1=p2=(struct student *)malloc(LEN);
  printf("please input name:");
  scanf("%s",p1->name);
  printf("please input number:");
  scanf("%ld",&p1->num);
  printf("please input math:");
  scanf("%f",&p1->mat);
  printf("please input english:");
  scanf("%f",&p1->eng);
  printf("please input computer:");
  scanf("%f",&p1->com);
  p1->sum=p1->mat+p1->eng+p1->com;
  p1->aver=p1->sum/3;
  while(1)
  {
    n=n+1;
    if(n==1)head=p1;
    else p2->next=p1;
    p2=p1;
    p1=(struct student*)malloc(LEN);
    printf("please input name:");
    scanf("%s",p1->name);
    if((strcmp(p1->name,"0")==0))
    {
      free(p1);
      return(head);}

      printf("please input number:");
      scanf("%ld",&p1->num);
      printf("please input math:");
      scanf("%f",&p1->mat);
       printf("please input english:");
       scanf("%f",&p1->eng);
       printf("please input computer:");
       scanf("%f",&p1->com);
       p1->sum=p1->mat+p1->eng+p1->com;
       p1->aver=p1->sum/3;
    }
    p2->next=NULL;
    return(head);
  }
  void print(struct student *head)
  {
     struct student *p;
    clrscr();
    printf("****************************ALL STUDENTS****************************\n");
    printf("number        name           math    english     computer   sum     aver\n");
    p=head;
    if(p!=NULL)
    do
    {
        printf("%-10ld    %-10s     %-5.1f   %-5.1f       %-5.1f      %-5.1f   %-6.2f\n",p->num,p->name,p->mat,p->eng,p->com,p->sum,p->aver);
        p=p->next;
     }while(p!=NULL);
     printf("press anykey out!\n");
    getch();
}

main()
{float aa,ff=9;
aa=sqrt(aa);
head=creat();
print(head);
}


没格式的代码看起来很麻烦,改了下格式,PS:{dd 在大括号下不换行这种教材上的风格很不合我的代码风格... - -# 不知有没人和我一样...

[ 本帖最后由 Sai999 于 2007-1-19 16:45 编辑 ]
发表于 2007-1-18 17:13 | 显示全部楼层
一般情况下指针出问题就会这样......
回复

使用道具 举报

发表于 2007-1-18 17:16 | 显示全部楼层
用英文-_-!!!
回复

使用道具 举报

 楼主| 发表于 2007-1-18 17:17 | 显示全部楼层
原帖由 gyCai 于 2007-1-18 17:13 发表
一般情况下指针出问题就会这样......

我是用了指针,能说清除点吗?
回复

使用道具 举报

 楼主| 发表于 2007-1-18 17:28 | 显示全部楼层
原帖由 毛啦啦 于 2007-1-18 17:16 发表
用英文-_-!!!

没用中文呢
回复

使用道具 举报

发表于 2007-1-18 17:36 | 显示全部楼层
极有可能是用了静态内存(好像不是这样说?)  里的字符串常量,

简单点说就是对  char *  指针指向的字符串显式地申请空间
回复

使用道具 举报

 楼主| 发表于 2007-1-18 17:39 | 显示全部楼层
我用得是动态的p1=(struct student*)malloc(LEN);
回复

使用道具 举报

发表于 2007-1-18 17:44 | 显示全部楼层
出错的原因不一定是这段代码

建议楼主先做几次测试,找找看什么情况下才会有“乱码”出现
回复

使用道具 举报

 楼主| 发表于 2007-1-18 17:52 | 显示全部楼层
原帖由 小I 于 2007-1-18 17:44 发表
出错的原因不一定是这段代码

建议楼主先做几次测试,找找看什么情况下才会有“乱码”出现

我拿出来试过,也是有时会乱码。
PS:同学的机是AMD3600X2的,会不会TC对双核不太........
回复

使用道具 举报

发表于 2007-1-18 17:56 | 显示全部楼层
这个要你认真点看乱码是什么时候什么情况下才产生的了
先软后硬。。。先不要怀疑硬件的问题,我认为不大可能是硬件的问题...
回复

使用道具 举报

发表于 2007-1-18 18:00 | 显示全部楼层
我那时做也遇过这样的问题,同学也遇到过,
那时还说,机器心情好时就给你输出正确结果
不好时就输出乱码

他的问题是重启就可以输出正常,但运行一段时间又会乱码
我的就忘了 - -#

不过后来还是找到问题是出在代码里....
回复

使用道具 举报

发表于 2007-1-18 18:33 | 显示全部楼层
用visual c++编译。。中文版的显示中文没问题。。
回复

使用道具 举报

发表于 2007-1-18 18:54 | 显示全部楼层
if((strcmp(p1->name,"0")==0))
        {
                free(p1);
                return(head);
        }

这里可能返回得不正解吧?
要不要先令p2->next=NULL;然后才返回呢?
回复

使用道具 举报

发表于 2007-1-18 19:09 | 显示全部楼层
嗯~~~~链表结尾有可能不为NULL

每生成一个新的链表节点的第一件事就是把它的next置NULL,通常来说这是个好习惯
回复

使用道具 举报

 楼主| 发表于 2007-1-18 21:57 | 显示全部楼层
原帖由 毛啦啦 于 2007-1-18 19:09 发表
嗯~~~~链表结尾有可能不为NULL

每生成一个新的链表节点的第一件事就是把它的next置NULL,通常来说这是个好习惯

这里p2->next=NULL;已经给了
回复

使用道具 举报

发表于 2007-1-18 22:12 | 显示全部楼层
只输入一个记录
然后输入一个0
执行到
if((strcmp(p1->name,"0")==0))
        {
                free(p1);
                return(head);
        }
就返回了
还没来的及给呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-16 23:53

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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