100 鱼币
本帖最后由 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[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)
这样输入试试:
就是很多英文字母,可以有空格,就会出现那个错误,蛋疼啊。。。。。。。。。。。。
我来回答