鱼C论坛

 找回密码
 立即注册
查看: 1857|回复: 12

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

[复制链接]
发表于 2013-12-15 19:00:07 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 cuibaowenown2 于 2013-12-15 21:30 编辑

直接代码(VC下运行可过):
进去后按1录入数据,然后一直录入数据,某次录入的时候就会出现:
QQ截图2013121521314227.png
我怒了,表示怎么找都找不出问题所在


#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[COUNTS][5]={        "姓名",
                                                                "性别",
                                                                "班级",
                                                                "学号",
                                                                "分数",
                                                                "籍贯",
                                                                "科目",
                                                                "教师",
                                                                "教室",
                                                                "时间"};

//输出长度定义
const int length[COUNTS+1]={6,                //学生
                                                        4,                //性别
                                                        8,                //班级
                                                        10,                //学号
                                                        4,                //分数
                                                        8,                //籍贯
                                                        8,                //科目
                                                        8,                //教师
                                                        7,                //教室
                                                        6,                //时间
                                                        20};        //其它
struct Data
{
        char studentname[LENGTH];
        char sex[LENGTH];
        char classandgrade[LENGTH];
        char ID[LENGTH];
        char score[LENGTH];
        char address[LENGTH];
        char subject[LENGTH];
        char teachername[LENGTH];
        char classroom[LENGTH];
        char time[LENGTH];
        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[LENGTH+1],        //获得用户输入信息
                 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[no],output);
                        output+=LENGTH;
                        no++;
                }
                if (signal>_time)        //输入完了
                {
                        //提醒用户查看输入信息正确性
                        printf("输入完毕,指令(输入正确则输入其它任意指令):");
                        SetUnderline(length[signal]);
                }
                else        //继续输入
                {
                        printf("%s:",title[no]);
                        SetUnderline(length[no]);
                }
               
                gets(str);
                if (strlen(str)>=(orderlen=strlen("quit")))        //可能有指令"结束输入"
                {
                        ch=str[orderlen];        //保存数据以便恢复
                        str[orderlen]='\0';
                        if (0==strcmp(str,"quit"))
                        {
                                free(p);
                                return NULL;
                        }
                        str[orderlen]=ch;        //恢复数据
                }
                if (strlen(str)>=(orderlen=strlen("previous")))        //可能有指令“返回上一个输入”
                {
                        ch=str[orderlen];        //保存数据以便恢复
                        str[orderlen]='\0';
                        if (0==strcmp(str,"previous"))
                        {
                                if (_stu==signal)        //第一个数据
                                {
                                        puts("当前为第一个数据!指令错误...");
                                        system("pause");
                                }
                                else
                                {
                                        signal--;
                                }
                                continue;
                        }
                        str[orderlen]=ch;        //恢复数据
                }
                //输入正确,录入数据
                str[LENGTH]='\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[pos],title[pos]);
        putchar('\n');

        PDATA p=head;
        do
        {
                char *tp=(char*)p;
                for (pos=0;pos<COUNTS;pos++)
                        printf("%-*.*s ",length[pos],length[pos],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]='_';
                pos++;
        }
        while (--length>0);

        length=_length;        //还原

        do
        {
                str[pos]='\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[LENGTH+1];
        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[LENGTH+1];        //查询内容
                                printf("全词匹配开关:%s\n",true==whole_word ? "开" : "关");
                                printf("请输入要查询的数据:");
                                SetUnderline(length[COUNTS]);
                                gets(passage);
                                system("cls");
                                puts("您要查询的数据如下:");
                                ShowSpecifyData(NULL,passage,whole_word);
                                system("pause");
                                break;
                        }
                        case '2':
                        {
                                //指定字段查询
                                system("cls");
                                int pos;        //循环遍历字段
                                char passage[LENGTH+1];        //查询内容
                                char field[LENGTH+1];        //记录字段
                                printf("全词匹配开关:%s\n",true==whole_word ? "开" : "关");
                                //提示信息
                                printf("请输入要在哪个字段查询数据(");
                                for (pos=0;pos<COUNTS;pos++)
                                        printf("%s、",title[pos]);
                                printf("\b):\n");
                                SetUnderline(length[COUNTS]);
                                gets(field);
                                //无指定字段
                                for (pos=0;pos<COUNTS;pos++)
                                        if (0==strcmp(field,title[pos]))
                                                break;
                                if (COUNTS==pos)        
                                {
                                        puts("无指定字段...");
                                        system("pause");
                                        break;
                                }
                                //字段输入正确
                                printf("请输入要查询的数据(字段:%s):",field);
                                SetUnderline(length[COUNTS]);
                                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[pos]))
                        {
                                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[len_pas];        //临时保存数据
                                        tp[len_pas]='\0';
                                        bool findout=!strcmp(tp,passage);        //字段是否相同
                                        tp[len_pas]=temp;
                                        if (true==findout)        //搜索到了
                                        {
                                                if (false==isoutput)        //第一次搜索到
                                                {
                                                        //显示标题
                                                        for (int pos=0;pos<COUNTS;pos++)
                                                                printf("%-*s ",length[pos],title[pos]);
                                                        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[pos],length[pos],tp+LENGTH*pos);
        putchar('\n');
}好吧,不隐藏了,发文件:

Main.zip (3.21 KB, 下载次数: 7)

这样输入试试:
QQ截图20131215190103.png
就是很多英文字母,可以有空格,就会出现那个错误,蛋疼啊。。。。。。。。。。。。

QQ截图20131215190103.png
QQ截图2013121521314227.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-15 19:37:46 | 显示全部楼层
源码在哪呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-15 19:43:22 | 显示全部楼层
为啥我录入完了都没发现你说的情况呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-15 20:27:53 | 显示全部楼层
看看看看!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-15 20:53:06 | 显示全部楼层
本帖最后由 musilintan 于 2013-12-15 20:58 编辑

先看看再说。。。。。建议提问求助的时候不要搞什么隐藏,我们是来给你看问题的,不是来给你踩楼的....:sweat:
你把代码压缩发上来吧。粘贴复制的后果很严重的。
QQ截图20131215205851.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-15 20:56:15 | 显示全部楼层

先看看再说。。。。。建议提问求助的时候不要搞什么隐藏,我们是来给你看问题的,不是来给你踩楼的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-15 21:07:57 | 显示全部楼层

QQ截图20131215210712.png

输入了一卡车也没出现你那个问题。。。。看起来很正常。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-12-16 13:00:57 | 显示全部楼层
:huffy::huffy::huffy::huffy::huffy::huffy::huffy::huffy::huffy::huffy::huffy::huffy:还没人解答???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-16 13:13:12 | 显示全部楼层
没粗线你的bug,估计是野指针,在函数入口家if(NULL!=p),并且free之后加上p=NULL;(p是指针变量,没时间帮你debug了,自己动手才有收获)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-12-16 13:18:47 | 显示全部楼层
谁说我自己没有动手?我搞了一个半小时没找到才来问的好么,问题我已经找到了,谢谢大家:huffy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-17 01:50:13 | 显示全部楼层
教学管理系统?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-12-17 16:54:09 | 显示全部楼层
嗯,学校布置的,我想做得华丽点:huffy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-28 10:28:40 | 显示全部楼层
感谢楼主无私奉献!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 07:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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