首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言储存、读取、修改功能 有关问题出现“屯屯屯屯屯屯屯屯屯屯屯屯屯”

2012-06-08 
C语言储存、读取、修改功能 问题出现“屯屯屯屯屯屯屯屯屯屯屯屯屯”我是新手,所以写得比较差。一下这个程序可

C语言储存、读取、修改功能 问题出现“屯屯屯屯屯屯屯屯屯屯屯屯屯”
我是新手,所以写得比较差。
一下这个程序可以运行,但是储存 读取 修改时 打印出现“屯屯屯屯屯屯屯屯屯屯屯屯屯”

太无奈了,请帮我看看。谢谢

[code=C/C++][/code]
#include"global.h"



//-------函数实现-------------------------- 
Link Create(Link Head)
{//创建一个带头节点的空链表。 
Head=(Link)malloc(sizeof(Node));
if(!Head)
{
printf("分配内存失败!");
return 0;
}

Head->Next=NULL;
return Head;
}

void Release(Link Head) 
{//释放链表。 
Link ptr;//声明一个操作用的指针
while(Head!=NULL)
{
ptr=Head;
Head=Head->Next;
free(ptr);//释放借点资源
}
}

Link Add(Link Head) 
{//前插法添加数据。 
Link pNew;//声明一个新节点。
char again;
char code[10],name[30],sex,edubg[30],post[30],department[30],address[50],phone[20]; 
int year,wyear; 
int wage; 
do
{
pNew=(Link)malloc(sizeof(Node));
//数据域
printf("请输入职工工号:\n");
scanf("%s",code);
printf("请输入职工姓名:\n");
scanf("%s",name);
printf("请输入职工性别(M/F):\n");
getchar();
scanf("%c",&sex);
printf("请输入职工的出生年份(1900-2000):\n");
scanf("%d",&year);
while(year<1900||year>2000)
{
printf("请输入正确的年份。");
scanf("%d",&year);
}
printf("请输入职工的工作年份(1900-2012):\n");
scanf("%d",&wyear);
while(wyear<1900||wyear>2012)
{
printf("请输入正确的年份。");
scanf("%d",&wyear);
}
printf("请输入职工的学历:\n");
scanf("%s",edubg);
printf("请输入职工的职称:\n");
scanf("%s",post);
printf("请输入职工所在部门:\n");
scanf("%s",department);
printf("请输入职工的住址:\n");
scanf("%s",address);
printf("请输入职工的联系电话:\n");
scanf("%s",phone);
printf("请输入职工的月薪(小于60000):\n");
scanf("%d",&wage);
while(wage>60000)
{
printf("请输入正确的月薪数据。");
scanf("%d",&wage);
}
strcpy(pNew->m_Code,code);
pNew->m_Code[strlen(code)+1]='\0';
strcpy(pNew->m_Name,name);
pNew->m_Name[strlen(name)+1]='\0';
pNew->m_Sex=sex;
pNew->m_Year=year;
pNew->m_WYear=wyear;
strcpy(pNew->m_EduBG,edubg);
pNew->m_EduBG[strlen(edubg)+1]='\0';
strcpy(pNew->m_Post,post);
pNew->m_Post[strlen(post)+1]='\0';
strcpy(pNew->m_Department,department);
pNew->m_Department[strlen(department)+1]='\0';
strcpy(pNew->m_Address,address);
pNew->m_Address[strlen(address)+1]='\0';
strcpy(pNew->m_Phone,phone);
pNew->m_Phone[strlen(phone)+1]='\0';
pNew->m_Wage=wage;

//指针域
pNew->Next=Head->Next;
Head->Next=pNew;
printf("数据添加成功!是否继续添加?(Y/N):");


again=getchar();
again=toupper(again);
while(again!='Y'&&again!='N')
{
again=getchar();
again=toupper(again);
}
}while(again=='Y');
return Head;
}



bool Search(Link Head)
{//查询同时满足“姓名”和“部门”的职工信息。
Link ptr;
char department[30];
char name[30];
int flag=0;
int pp=0;
ptr=Head->Next;
printf("请输入部门:");
scanf("%s",department);
printf("请输入姓名:");
scanf("%s",name);
printf("\n\n\n----------------查询结果------------------\n");
printf("\n 工号 ┃ 姓名 ┃性别┃出生年份┃工作年份┃ 学历 ┃ 职称 ┃ 部门 ┃ 住址 ┃ 电话 ┃ 月薪 ┃");
while(ptr)
{
pp=(strcmp(ptr->m_Name,name)&&strcmp(ptr->m_Department,department));
if(!pp)


{
Display_Node(ptr);
flag=1;
}
ptr=ptr->Next;//查询下一个节点
}
if(flag==1)
{
printf("\n----------------查找完毕------------------\n");
system("PAUSE");
return true;
}
else
{
printf("无此职工的信息!\n");
system("PAUSE");
return false;

}
}

Link Search_Unique_Front(Link Head) 
{//查询满足“职工代码“的职工信息(职工代码必需唯一)。 
Link ptr;
char code[10];
int flag1=0;
ptr=Head;
printf("请输入职工工号:");
scanf("%s",code);

while(ptr->Next)
{
if((strcmp(ptr->Next->m_Code,code)))
{
if(flag1=0)
{
printf("\n----------------查询结果------------------\n");
printf("\n 工号 ┃ 姓名 ┃性别┃出生年份┃工作年份┃ 学历 ┃ 职称 ┃ 部门 ┃ 住址 ┃ 电话 ┃ 月薪 ┃\n\n\n\n");
flag1=1;
}
Display_Node(ptr);//打印满足条件的节点
return ptr; //注意,是返回的查询到的节点的直接前趋节点。 
}//此处有疑问?!?!?!?!?!?!?!
ptr->Next=ptr->Next->Next;//查询下一个节点

}
return ptr;

}



void Display_List(Link Head)
{
Link ptr;
ptr=Head->Next;
system("CLS");
printf("=============================================所有职工信息=====================================================\n");
printf("\n 工号 ┃ 姓名 ┃性别┃出生年份┃工作年份┃ 学历 ┃ 职称 ┃ 部门 ┃ 住址 ┃ 电话 ┃ 月薪 ┃");
while(ptr)
{
Display_Node(ptr);
ptr=ptr->Next;
}
system("PAUSE");
}


void Display_Node(Link pNode)

{//在标准输出设备上输出。 
printf("\n%8s┃%8s┃%4c┃%8d┃%8d┃%8s┃%8s┃%8s┃%10s┃%11s┃%6d┃\n",pNode->m_Code,pNode->m_Name,pNode->m_Sex,pNode->m_Year,pNode->m_WYear,pNode->m_EduBG,pNode->m_Post,pNode->m_Department,pNode->m_Address,pNode->m_Phone,pNode->m_Wage);

}


Link Modify(Link Head)
{// 修改单一个节点。 
Link ptr;
ptr=Search_Unique_Front(Head);
char code[10],name[30],sex,edubg[30],post[30],department[30],address[50],phone[20]; 
int year,wyear; 
int wage; 
if(ptr->Next)
{
printf("请输入职工工号:\n");
scanf("%s",code);
printf("请输入职工姓名:\n");
scanf("%s",name);
printf("请输入职工性别(M/F):\n");
getchar();
scanf("%c",&sex);
printf("请输入职工的出生年份(1900-2000):\n");
scanf("%d",&year);
while(year<1900||year>2000)
{
printf("请输入正确的年份。");
scanf("%d",&year);
}
printf("请输入职工的工作年份(1900-2012):\n");
scanf("%d",&wyear);
while(wyear<1900||wyear>2012)
{
printf("请输入正确的年份。");
scanf("%d",&wyear);
}
printf("请输入职工的学历:\n");
scanf("%s",edubg);
printf("请输入职工的职称:\n");
scanf("%s",post);
printf("请输入职工所在部门:\n");
scanf("%s",department);
printf("请输入职工的住址:\n");
scanf("%s",address);
printf("请输入职工的联系电话:\n");
scanf("%s",phone);
printf("请输入职工的月薪(小于60000):\n");
scanf("%d",&wage);
while(wage>60000)
{
printf("请输入正确的月薪数据。");
scanf("%d",&wage);
}
strcpy(ptr->Next->m_Code,code);//因ptr是前趋节点,所以要用ptr->Next; 
ptr->Next->m_Code[strlen(code)+1]='\0';
strcpy(ptr->Next->m_Name,name);
ptr->Next->m_Name[strlen(name)+1]='\0';
ptr->Next->m_Sex=sex;
ptr->Next->m_Year=year;
ptr->Next->m_WYear=wyear;
strcpy(ptr->Next->m_EduBG,edubg);
ptr->Next->m_EduBG[strlen(edubg)+1]='\0';


strcpy(ptr->Next->m_Post,post);
ptr->Next->m_Post[strlen(post)+1]='\0';
strcpy(ptr->Next->m_Department,department);
ptr->Next->m_Department[strlen(department)+1]='\0';
strcpy(ptr->Next->m_Address,address);
ptr->Next->m_Address[strlen(address)+1]='\0';
strcpy(ptr->Next->m_Phone,phone);
ptr->Next->m_Phone[strlen(phone)+1]='\0';
ptr->Next->m_Wage=wage;
printf("\n修改成功!\n");

}
else
printf("没有找到此职工的记录,无法修改!\n");
system("PAUSE");
return Head;

}




Link Del(Link Head)
{
Link ptr;
Link ptr_front;
ptr_front=Search_Unique_Front(Head);
ptr=ptr_front->Next;
if(ptr)
{
ptr_front->Next =ptr->Next;
free (ptr);
printf("\n修改成功!\n");
}
else
printf("没有找到此职工的记录,无法删除!\n");
system("PAUSE");
return Head;
}


void Save_ByFile(Link Head,FILE *fp)
{
Link pNode;
pNode=Head->Next;
fflush(fp);
while(pNode)
{
fwrite(pNode,sizeof(Node),1,fp);
pNode=pNode->Next;
}
printf("数据文件保存成功!\n");
system("PAUSE");

}


Link Sort(Link Head)
{//我创建的是带头节点的链表。用直接插入法。 
if((Head->Next==NULL)||(Head->Next->Next==NULL))//此步条件判断非常有价值。
{
printf("书籍节点少于两个,不用排序!\n");
system("PAUSE");
return Head;
}
//第二步;
Link ptr,ptr_F,ptr_N;
ptr=Head->Next->Next;
ptr_F=Head;
Head->Next->Next=NULL;//到此,分成了两个链表
//第三步
while(ptr)
{
ptr_N=ptr->Next;
ptr_F=Head;//ptr_F的归位;
while(ptr_F->Next)
{
if(ptr->m_Wage>ptr_F->Next->m_Wage)//排序条件~~~~!!!!!
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;
break;
}//if
else
{
ptr_F=ptr_F->Next;
}

}//while(ptr->Next)
if(ptr_F->Next=NULL)
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;//表示查到有序链表的最后面了
}
ptr=ptr_N;//归位,准备下一次排序
}//while(ptr)
printf("从高到低,排序成功!");
}
Link load(Link Head,FILE *fp)
{
Link pNode;
pNode=Head;

while(!feof(fp))
{
pNode=(Link)malloc(sizeof(Node));
fread(pNode,sizeof(Node),1,fp);
printf("\n%8s┃%8s┃%4c┃%8d┃%8d┃%8s┃%8s┃%8s┃%10s┃%11s┃%6d┃\n",pNode->m_Code,pNode->m_Name,pNode->m_Sex,pNode->m_Year,pNode->m_WYear,pNode->m_EduBG,pNode->m_Post,pNode->m_Department,pNode->m_Address,pNode->m_Phone,pNode->m_Wage);
pNode=pNode->Next;
}
printf("文件载入成功!\n");

system("PAUSE");
return Head;



}


int main()
{
FILE *fp;
Link Head=0;
Head=Create(Head);
fp=fopen("aa.txt","r+");
if(!fp)
{
printf("打开文件失败");
return 1;
}
Head=load(Head,fp);
int menu;
while(1)
{
system("cls");
printf("*****************************************************\n");
printf("*====================菜单选顶=======================*\n");
printf("*===================================================*\n");
printf("* 1.注册职工 2.修改信息 3.删除信息 4.信息查询 *\n");
printf("* 5.保存文件 6.工资排行 7.信息显示 0.退出系统 *\n");
printf("*****************************************************\n");
printf("请选择相应操作菜单项:");
scanf("%d",&menu);
while(menu>7||menu<0)
{
printf("请选择正确的菜单选项:");
scanf("%d",&menu);
}
switch(menu) 

case 0: 


{printf("成功退出系统!");fclose(fp);} 
return 0; 
case 1: 
Head=Add(Head); 
break; 
case 2: 
Head=Modify(Head); 
break; 
case 3: 
Head=Del(Head); 
break; 
case 4: 
Search(Head); 
break; 
case 5: 
Save_ByFile(Head,fp); 
break; 
case 6: 
Sort(Head); 
break; 
case 7: 
Display_List(Head);
break; 
default: 
printf("请选择正确的菜单项进行操作。多谢合作!"); 
}
}
Release(Head);  
fclose(fp);
return 0;
}

[解决办法]
典型的字符数组木有初始化的现象。
[解决办法]
关于 烫 和 屯的问题多半没有将内存清零造成的
pNew=(Link)malloc(sizeof(Node));
memset(pNew,0,sizeof(Node));//将内存清下零
这样试试,如果不行在每个malloc的地方都清下试试
需要包含关文件 string.h
[解决办法]
哥们,程序员要学会调试,不然会死的很惨的,至于怎么调试,Google,至于是什么问题,大家都说的差不多了。

探讨

然后呢
引用:

我的第一感觉跟你一样。
引用:

典型的字符数组木有初始化的现象。

[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

[解决办法]
是VC吧……明显的变量未初始化,“屯屯”是VC为了方便调试对未初始化的默认填充,这样你就能知道有变量未初始化了。记住定义变量一定要初始化,初始化数组最好全清零……

热点排行