cuibaowenown2 发表于 2013-12-15 19:00:07

VC编译的时候出现了诡异的错误,有时候出现有时候不出现,我表示调试不出来,求鱼油帮

本帖最后由 cuibaowenown2 于 2013-12-15 21:30 编辑

直接代码(VC下运行可过):
进去后按1录入数据,然后一直录入数据,某次录入的时候就会出现:

我怒了,表示怎么找都找不出问题所在


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LENGTH 100
#define COUNTS 10
#define GetTail(p) while(p->next!=NULL)p=p->next      //取得链表尾部

const char title={      "姓名",
                                                                "性别",
                                                                "班级",
                                                                "学号",
                                                                "分数",
                                                                "籍贯",
                                                                "科目",
                                                                "教师",
                                                                "教室",
                                                                "时间"};

//输出长度定义
const int length={6,                //学生
                                                      4,                //性别
                                                      8,                //班级
                                                      10,                //学号
                                                      4,                //分数
                                                      8,                //籍贯
                                                      8,                //科目
                                                      8,                //教师
                                                      7,                //教室
                                                      6,                //时间
                                                      20};      //其它
struct Data
{
      char studentname;
      char sex;
      char classandgrade;
      char ID;
      char score;
      char address;
      char subject;
      char teachername;
      char classroom;
      char time;
      Data *previous;
      Data *next;
} *head=NULL;

typedef Data *PDATA;

void GetData();                //新增数据
PDATA Scanf();                //输入数据
void ShowData();      //显示数据
void SetUnderline(int length);      //输出一定长度的下划线并将光标移至最前
void FindData();      //查询数据
void ShowSpecifyData(char *field,char *passage,bool whole_word);      //搜索并显示指定的数据
void ShowOneData(PDATA p);      //显示指定的数据

void main()
{
      //欢迎界面
      puts(" --------------------");
      puts("|欢迎使用教学管理系统|");
      puts(" --------------------");
      system("pause");
      
      while (1)
      {
                system("cls");
                puts("1->录入数据");
                puts("2->显示数据");
                puts("3->查询数据");
                puts("4->退出");
                char input,ch;
                //取得信息并清除残余数据
                input=getchar();
                while ((ch=getchar())!='\n' && ch!=EOF);
                switch (input)
                {
                        case '1':
                        {
                              //录入数据
                              system("cls");
                              GetData();
                              break;
                        }
                        case '2':
                        {
                              //显示数据
                              system("cls");
                              ShowData();
                              system("pause");
                              break;
                        }
                        case '3':
                        {
                              //查询数据
                              system("cls");
                              FindData();
                              break;
                        }
                        case '4':
                        {
                              //退出
                              puts("欢迎使用...");
                              //释放内存
                              if (head!=NULL)
                              {
                                        PDATA p=head;
                                        while (p->next!=NULL)
                                        {
                                                p=p->next;
                                                free(p->previous);
                                        }
                                        free(p);
                              }
                              system("pause");
                              return;
                              break;
                        }
                        default:
                        {
                              //指令错误
                              puts("指令错误,请重新输入...");
                              system("pause");
                              break;
                        }
                }
      }
}

void GetData()                //新增数据
{
      PDATA reg;      //记录Scanf()返回值
      if (NULL==(reg=Scanf()))                //如果用户中止录入
      {
                return;
      }
      PDATA p=head;      //临时指针,用于指向链尾
      //新建链节
      if (NULL==head)      //判断是否是第一次输入
      {
                head=reg;
      }
      else
      {
                GetTail(p);
                p->next=reg;
                reg->previous=p;
      }
}

PDATA Scanf()                //输入数据
{
      PDATA p=(PDATA)malloc(sizeof(Data));      //临时数据
      p->previous=NULL;
      p->next=NULL;

      enum {_stu,_sex,_cag,_ID,_sco,_add,_sub,_tea,_room,_time};      //信号,记录用户应该输入哪里了
      int signal=_stu;
      char str,      //获得用户输入信息
               ch;                //暂时和str交换数据(判断是否输入指令)
      int orderlen;      //记录指令长度
      //开始输入
      do
      {
                system("cls");
                ShowData();
                puts("\n开始录入数据,可输入指令:\n\"previous\"---返回上一个输入\n\"quit\"---结束输入,不保存");
               
                int no=0;      //该输入的字符串偏移
                char *output=(char*)p;

                while (no<signal)
                {
                        printf("%s:%s\n",title,output);
                        output+=LENGTH;
                        no++;
                }
                if (signal>_time)      //输入完了
                {
                        //提醒用户查看输入信息正确性
                        printf("输入完毕,指令(输入正确则输入其它任意指令):");
                        SetUnderline(length);
                }
                else      //继续输入
                {
                        printf("%s:",title);
                        SetUnderline(length);
                }
               
                gets(str);
                if (strlen(str)>=(orderlen=strlen("quit")))      //可能有指令"结束输入"
                {
                        ch=str;      //保存数据以便恢复
                        str='\0';
                        if (0==strcmp(str,"quit"))
                        {
                              free(p);
                              return NULL;
                        }
                        str=ch;      //恢复数据
                }
                if (strlen(str)>=(orderlen=strlen("previous")))      //可能有指令“返回上一个输入”
                {
                        ch=str;      //保存数据以便恢复
                        str='\0';
                        if (0==strcmp(str,"previous"))
                        {
                              if (_stu==signal)      //第一个数据
                              {
                                        puts("当前为第一个数据!指令错误...");
                                        system("pause");
                              }
                              else
                              {
                                        signal--;
                              }
                              continue;
                        }
                        str=ch;      //恢复数据
                }
                //输入正确,录入数据
                str='\0';
                char *tp=(char*)p+LENGTH*signal;
                strcpy(tp,str);
                signal++;      
      } while (signal<=_time+1);
      return p;
}

void ShowData()         //显示数据
{
      puts("已录入的数据:\n");
      if (NULL==head || ""==head->studentname)
      {
                puts("无");
                return;
      }

      //显示标题
      for (int pos=0;pos<COUNTS;pos++)
                printf("%-*s ",length,title);
      putchar('\n');

      PDATA p=head;
      do
      {
                char *tp=(char*)p;
                for (pos=0;pos<COUNTS;pos++)
                        printf("%-*.*s ",length,length,tp+LENGTH*pos);
                putchar('\n');
      } while ((p=p->next)!=NULL);
}

void SetUnderline(int length)      //输出一定长度的下划线并将光标移至最前
{
      int pos=0,      //下标
                _length=length;      //记录length的值
      if (length<=0) return;      //传入值错误

      char str[(LENGTH+1)*2]={'\0'};

      do
      {
                str='_';
                pos++;
      }
      while (--length>0);

      length=_length;      //还原

      do
      {
                str='\b';
                pos++;
      }
      while (--length>0);
      printf("%s",str);
}

void FindData()      //查询数据
{
      //数据为空
      if (NULL==head)
      {
                puts("当前没有录入数据...");
                system("pause");
                return;
      }

      bool whole_word;      //全词匹配开关
      //全词匹配
setswitch:
      system("cls");
      puts("是否开启全词匹配开关(Y<y>/N<n>)");
      char input=getchar(),                //记录输入
               ch;      //清空输入流
      while ((ch=getchar())!='\n' && ch!=EOF);
      if ('Y'==input || 'y'==input) whole_word=true;
      else if ('N'==input || 'n'==input) whole_word=false;
      else
      {
                puts("输入信息错误,请重新输入...");
                system("pause");
                goto setswitch;      //输入错误
      }
                              
      char str;
      while (1)
      {
                system("cls");
                printf("请选择查询方式(全词匹配开关:%s)\n",true==whole_word?"开":"关");
                puts("1->全部查询(在所有字段中查询)");
                puts("2->指定字段查询");
                puts("3->改变全词匹配开关");
                puts("4->退出查询");
                char input=getchar();
                while ((ch=getchar())!='\n' && ch!=EOF);
                switch (input)
                {
                        case '1':
                        {
                              //全部查询(在所有字段中查询)
                              system("cls");
                              char passage;      //查询内容
                              printf("全词匹配开关:%s\n",true==whole_word ? "开" : "关");
                              printf("请输入要查询的数据:");
                              SetUnderline(length);
                              gets(passage);
                              system("cls");
                              puts("您要查询的数据如下:");
                              ShowSpecifyData(NULL,passage,whole_word);
                              system("pause");
                              break;
                        }
                        case '2':
                        {
                              //指定字段查询
                              system("cls");
                              int pos;      //循环遍历字段
                              char passage;      //查询内容
                              char field;      //记录字段
                              printf("全词匹配开关:%s\n",true==whole_word ? "开" : "关");
                              //提示信息
                              printf("请输入要在哪个字段查询数据(");
                              for (pos=0;pos<COUNTS;pos++)
                                        printf("%s、",title);
                              printf("\b):\n");
                              SetUnderline(length);
                              gets(field);
                              //无指定字段
                              for (pos=0;pos<COUNTS;pos++)
                                        if (0==strcmp(field,title))
                                                break;
                              if (COUNTS==pos)      
                              {
                                        puts("无指定字段...");
                                        system("pause");
                                        break;
                              }
                              //字段输入正确
                              printf("请输入要查询的数据(字段:%s):",field);
                              SetUnderline(length);
                              gets(passage);
                              system("cls");
                              puts("您要查询的数据如下:");
                              ShowSpecifyData(field,passage,whole_word);
                              system("pause");
                              break;
                        }
                        case '3':
                        {
                              //改变全词匹配开关
                              goto setswitch;
                              break;
                        }
                        case '4':
                        {
                              //退出查询
                              return;                        
                        }
                        default:
                        {
                              //输入错误
                              puts("输入错误,请重新输入...");
                              system("pause");
                              break;
                        }
                }
      }
}

void ShowSpecifyData(char *field,char *passage,bool whole_word)      //搜索并显示指定的数据
{
      PDATA p=head;
      int endpos;      //记录字段结束位置
      int len_pas=strlen(passage);      //关键字长度
      bool isoutput=false;                //记录是否已搜索到符合关键字的数据

      do
      {
                for (int pos=0;pos<COUNTS;pos++)
                {
                        //当前字段需要搜索的判断
                        if (NULL==field || 0==strcmp(field,title))
                        {
                              char *tp=(char*)p + LENGTH * pos;      //定位字段位置
                              int len_field=strlen(tp);      //取得当前字段长度
                              if (len_pas>len_field) continue;                //关键字过长,不可能匹配,结束
                              if (true==whole_word)      //全词匹配开关开启
                                        endpos=0;      //意为不循环
                              else
                                        endpos=len_field-len_pas;
                              for (int i=0;i<=endpos;i++)      //循环搜索关键字
                              {
                                        char temp=tp;      //临时保存数据
                                        tp='\0';
                                        bool findout=!strcmp(tp,passage);      //字段是否相同
                                        tp=temp;
                                        if (true==findout)      //搜索到了
                                        {
                                                if (false==isoutput)      //第一次搜索到
                                                {
                                                      //显示标题
                                                      for (int pos=0;pos<COUNTS;pos++)
                                                                printf("%-*s ",length,title);
                                                      putchar('\n');
                                                      isoutput=true;                //搜索到了
                                                }
                                                ShowOneData(p);
                                                break;
                                        }      
                              }
                        }
                }
      } while ((p=p->next)!=NULL);
      //如果没有搜索到
      if (false==isoutput)
                printf("没有搜索到关键字为\"%s%s\"的数据\n",NULL==field ? "" : strcat(field,":"),passage);
}

void ShowOneData(PDATA p)      //显示指定的数据
{
      char *tp=(char*)p;
      for (int pos=0;pos<COUNTS;pos++)
                printf("%-*.*s ",length,length,tp+LENGTH*pos);
      putchar('\n');
}好吧,不隐藏了,发文件:



这样输入试试:

就是很多英文字母,可以有空格,就会出现那个错误,蛋疼啊。。。。。。。。。。。。

maomingkun 发表于 2013-12-15 19:37:46

源码在哪呢?

maomingkun 发表于 2013-12-15 19:43:22

为啥我录入完了都没发现你说的情况呢?

魔火 发表于 2013-12-15 20:27:53

看看看看!!!!!

musilintan 发表于 2013-12-15 20:53:06

本帖最后由 musilintan 于 2013-12-15 20:58 编辑

先看看再说。。。。。建议提问求助的时候不要搞什么隐藏,我们是来给你看问题的,不是来给你踩楼的....:sweat:
你把代码压缩发上来吧。粘贴复制的后果很严重的。

林偏殇 发表于 2013-12-15 20:56:15


先看看再说。。。。。建议提问求助的时候不要搞什么隐藏,我们是来给你看问题的,不是来给你踩楼的

musilintan 发表于 2013-12-15 21:07:57

musilintan 发表于 2013-12-15 20:53 static/image/common/back.gif
先看看再说。。。。。建议提问求助的时候不要搞什么隐藏,我们是来给你看问题的,不是来给你踩楼的....:swe ...



输入了一卡车也没出现你那个问题。。。。看起来很正常。。。。

cuibaowenown2 发表于 2013-12-16 13:00:57

:huffy::huffy::huffy::huffy::huffy::huffy::huffy::huffy::huffy::huffy::huffy::huffy:还没人解答???

hate茶叶蛋 发表于 2013-12-16 13:13:12

没粗线你的bug,估计是野指针,在函数入口家if(NULL!=p),并且free之后加上p=NULL;(p是指针变量,没时间帮你debug了,自己动手才有收获)

cuibaowenown2 发表于 2013-12-16 13:18:47

谁说我自己没有动手?我搞了一个半小时没找到才来问的好么,问题我已经找到了,谢谢大家:huffy:

Lenny 发表于 2013-12-17 01:50:13

教学管理系统?

cuibaowenown2 发表于 2013-12-17 16:54:09

嗯,学校布置的,我想做得华丽点:huffy:

arise 发表于 2013-12-28 10:28:40

感谢楼主无私奉献!
页: [1]
查看完整版本: VC编译的时候出现了诡异的错误,有时候出现有时候不出现,我表示调试不出来,求鱼油帮