头疼的指针问题?
- C/C++ code
#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 20/*struct studentchange//定义结构体,将student中的定长记录改成变长记录{string name;string num;string age;string sex;};*/typedef struct studentchange//定义结构体,将student中的定长记录改成变长记录{char* name;char* num;char* tel;char* age;char* sex;}stud;struct studentindex//分别记录各个属性的长度,建立索引{int namelen;int numlen;int tellen;int agelen;int sexlen;int toallen;//一条记录的总共长度}studindex[N];stud studchange2[N];//存储从文件中读出来的记录信息/*struct studentc//记录每个studentindenx对象的长度{struct }*///定义一个为一页大小的块char buffer[1024];int contentlen;//一条记录的长度int contentlentotal=0;//所有记录的总长度; void strcopy(char a[],char b[],int n,int m);int main(){ //int attrLength(char*); char content[100]; int i,j;//定义通讯录stud stud[]={"Li","1001","18810366100","18","f", "Fun","1002","18810366101","19","m", "Wang1","1003","18810366102","17","f", "hei","1004","18810366103","18","f", "Gao","1005","18810366104","19","m", "Yu","1006","18810366105","17","f", "Feng","1007","18810366103","18","f", "Dou","1008","18810366104","19","m", "Wang2","1009","18810366105","17","f" , "Er","1010","18810366103","18","f", "San","1011","18810366104","19","m", "Zhao","1012","18810366105","17","f", "Qian","1013","18810366103","18","f", "Sun","1014","18810366104","19","m", "Li2","1015","18810366105","17","f", "Zhou","1016","18810366103","18","f", "Zheng","1017","18810366104","19","m", "Zhu","1018","18810366105","17","f" , "Xiaobai","1019","18810366103","18","f", "Meng","1020","18810366105","17","f"};//fstream iofile("studchange.dat",ios::in|ios::out|ios::binary);FILE *pf;if((pf=fopen("studchange.dat","ab+"))==NULL)//判断文件是否打开成功,一条记录一条记录追加printf("无法打开文件!"); for(i=0;i<N;i++){//为所有字段建立索引studindex[i].namelen=strlen(stud[i].name);printf("看看第%d条记录的姓名长度是:%d\n",i,studindex[i].namelen);// 测试一下studindex[i].numlen=strlen(stud[i].num);printf("看看第%d条记录的学号长度是:%d\n",i,studindex[i].numlen);// 测试一下studindex[i].tellen=strlen(stud[i].tel);printf("看看第%d条记录的电话长度是:%d\n",i,studindex[i].tellen);// 测试一下printf("0\n");studindex[i].agelen=strlen(stud[i].age);printf("0\n");studindex[i].sexlen=strlen(stud[i].sex);printf("看看第%d条记录的性别长度是:%d\n",i,studindex[i].sexlen);// 测试一下studindex[i].toallen=studindex[i].namelen+studindex[i].numlen+studindex[i].tellen+studindex[i].agelen+studindex[i].sexlen;printf("1\n");strcpy(content,stud[i].name);//将记录的各个属性拼接到一起printf("2\n");strcat(content,stud[i].num);strcat(content,stud[i].tel);strcat(content,stud[i].age);strcat(content,stud[i].sex);printf("看看第%d条记录的总信息是:%s\n",i,content);contentlen=strlen(content);//一条记录的长度fwrite(content,contentlen,1,pf);//将所有的记录写入文件中contentlentotal+=contentlen;contentlen=0;}fclose(pf);printf("\n");void query();void display();void update();char op;while(1){ printf("* Menu selection *\n"); printf("* 1.query *\n"); printf("* 2.display *\n"); printf("* 3.update *\n"); printf("* 4.exit *\n"); printf("* ****************************************\n"); printf("* Please enter selection:*"); scanf("%c",&op); switch(op) { case '1':query(); break; case '2':display(); break; case '3':update(); break; case '4':return 0; } getchar();}return 0; }void display() //打印文件中通讯录信息,并把读出来得记录放到结果体对象studchange2中。{ int i; FILE *pf2;if((pf2=fopen("studchange.dat","r+b"))==NULL)//判断文件是否打开成功,一条记录一条记录追加printf("无法打开文件!");char name[10];char num[10];char tel[20];char age[10];char sex[10];//将的信息输出到一个字符串中即可。int bufferlen=0;fread(buffer,contentlentotal,1,pf2);//将文件中的记录信息读到缓冲区中。printf("所有内容的长度是:%d\n",contentlentotal);printf("所有的记录信息是:%s\n",buffer);printf("**************** 通讯录 ******************\n");printf("姓名 学号 电话 年龄 性别\n");for(i=0;i<N;i++) //按照索引从文件中读出相应的记录,并把该记录复制给相应的结构体变量存储,便于其他操作。{int j;//指向buffer中各个字符信息 strcopy(name,buffer,bufferlen,studindex[i].namelen);//将记录的一个属性提取出来 studchange2[i].name=name;//将该条记录的该属性保存起来。 bufferlen+=studindex[i].namelen;strcopy( num,buffer,bufferlen,studindex[i].numlen);//将记录的一个属性提取出来 studchange2[i].num=num;//将该条记录的该属性保存起来。 bufferlen+=studindex[i].numlen;strcopy(tel,buffer,bufferlen,studindex[i].tellen);//将记录的一个属性提取出来 studchange2[i].tel=tel;//将该条记录的该属性保存起来。 bufferlen+=studindex[i].tellen;strcopy( age,buffer,bufferlen,studindex[i].agelen);//将记录的一个属性提取出来 studchange2[i].age=age;//将该条记录的该属性保存起来。bufferlen+=studindex[i].agelen;strcopy( sex,buffer,bufferlen,studindex[i].sexlen);//将记录的一个属性提取出来 studchange2[i].sex=sex;//将该条记录的该属性保存起来。bufferlen+=studindex[i].sexlen;printf("%s,%s,%s,%s,%s\n",studchange2[i].name,studchange2[i].num,studchange2[i].tel,studchange2[i].age,studchange2[i].sex);printf("\n");}//for循环}//函数体void query(){ int i; //void see1(struct student *p);// struct student *p;int method;char name[10];char num[10];char tel[20];char age[10];char sex[10]; while(1) { printf("* Menu selection *\n"); printf("* 请选择查询方式 *\n"); printf("* 1.按姓名查询 *\n"); printf("* 2.按学号查询 *\n"); printf("* 3.按电话查询 *\n"); printf("* 4.按年龄查询 *\n"); printf("* 5.按性别查询 *\n"); printf("* 6.返回主菜单 *\n"); printf("* *********************************************************\n");scanf("%d",&method);switch(method){ case 1: printf("请输入要查询的name:\n"); scanf("%s",&name); //printf("看看比较结果是:%d\n",strcmp(studchange2[0].name,name)); for(i=0;i<N;i++){ //首先将信息提取出if(!strcmp(studchange2[i].name,name))printf("name:%s\n",studchange2[i].name);printf("num:%s\n",studchange2[i].num);printf("tel:%s\n",studchange2[i].tel);printf("age:%s\n",studchange2[i].age);printf("sex:%s\n",studchange2[i].sex);printf("\n");} break; case 2: printf("* 请输入要查询的学号:\n"); scanf("%s",&num);for(i=0;i<N;i++){ if(!strcmp(studchange2[i].num,num)){printf("name:%s\n",studchange2[i].name);printf("num:%s\n",studchange2[i].num);printf("name:%s\n",studchange2[i].tel);printf("age:%s\n",studchange2[i].age);printf("sex:%s\n",studchange2[i].sex);printf("\n");}} break; case 3: printf("* 请输入要查询的电话\n"); scanf("%s",&tel);for(i=0;i<N;i++){ if(!strcmp(studchange2[i].tel,tel)){printf("name:%s\n",studchange2[i].name);printf("num:%s\n",studchange2[i].num);printf("name:%s\n",studchange2[i].tel);printf("age:%s\n",studchange2[i].age);printf("sex:%s\n",studchange2[i].sex);printf("\n");}} break; case 4: printf("* 请输入要查询的年龄\n"); scanf("%s",&age); for(i=0;i<N;i++){ //首先将信息提取出来 if(!strcmp(studchange2[i].age,age)){printf("name:%s\n",studchange2[i].name);printf("num:%s\n",studchange2[i].num);printf("name:%s\n",studchange2[i].tel);printf("age:%s\n",studchange2[i].age);printf("sex:%s\n",studchange2[i].sex);printf("\n");} } break; case 5: printf("* 请输入要查询的性别\n"); scanf("%s",&sex);printf("姓名 学号 电话 年龄 性别\n"); for(i=0;i<N;i++){ if(!strcmp(studchange2[i].sex,sex)){printf("%s,%s,%s,%s,%s",studchange2[i].name,studchange2[i].num,studchange2[i].tel,studchange2[i].age,studchange2[i].sex);printf("\n");} } break; default:return; } } }//将字符数组第m个到第n个字符copy到另外一个字符数组中void strcopy(char a[],char b[],int n,int m){ memcpy(a,&b[n],m); a[m]='\0';}void update(){}
代码有点长,但是只需要大家看两个函数就行了:display() 和 query(),
问题很简单:
在display()函数中:
- C/C++ code
printf("%s,%s,%s,%s,%s\n",studchange2[i].name,studchange2[i].num,studchange2[i].tel,studchange2[i].age,studchange2[i].sex);能正确输出文件中得记录信息,
但是在query()函数中:
- C/C++ code
if(!strcmp(studchange2[i].age,age)){printf("name:%s\n",studchange2[i].name);printf("num:%s\n",studchange2[i].num);printf("name:%s\n",studchange2[i].tel);printf("age:%s\n",studchange2[i].age);printf("sex:%s\n",studchange2[i].sex);}不能正确输出记录的信息,显示的是乱码
这是为什么啊????我将所有的记录信息都已经保存在结构体数组stud studchange2[N]中,
为什么两次提取出来的结果会不一致了???
[解决办法]
studchange2[i].name=name;//将该条记录的该属性保存起来。
你把局部变量赋给它没有用的。退出函数后,这块空间已经无效了。
需要new 出来,strcpy
studchange2[i].name = new char[strlen(name)];
if(studchange2[i].name)
{
strcpy(studchange2[i].name, name);
}
[解决办法]
学习一下汇编你就懂了 不解释
[解决办法]
[解决办法]
用malloc()
studchange2[i].name = malloc(sizeof(studchange2[i].name));
相当于你指定了一个内存地址给这个指针。
ps:赋值时不能直接让这个指针指向源数据,而要用memcpy(),将值拷到指针内存中才能在退出函数后,保存数据。
[解决办法]
乱码肯定是值的地方错了啊,,,你传值或者拷贝的地方好好看看啊~~~~
[解决办法]
typedef struct studentchange//定义结构体,将student中的定长记录改成变长记录
{
char* name;
char* num;
char* tel;
char* age;
char* sex;
}stud;
在初始化时,是不是应该先对该结构体的成员申请空间。
[解决办法]
用红色部分标记的是在你源代码基础上新增的
[code=C/C]
for(i=0;i <N;i++)
{
//为所有字段建立索引
...
printf("2\n");
strcat(content,stud[i.num);
strcat(content,stud[i].tel);
strcat(content,stud[i].age);
strcat(content,stud[i].sex);
printf("看看第%d条记录的总信息是:%s\n",i,content);
contentlen=strlen(content);//一条记录的长度
fwrite(content,contentlen,1,pf);//将所有的记录写入文件中
contentlentotal+=contentlen;
contentlen=0;
[color=#FF0000]studchange2[i].name = (char *)malloc(20);
studchange2[i].num = (char *)malloc(20);
studchange2[i].tel = (char *)malloc(20);
studchange2[i].age = (char *)malloc(20);
studchange2[i].sex = (char *)malloc(20);[/color]
}
void query();
void display();
void update();
char op;
[color=#FF0000]display();[/color]
while(1)
{
printf("* Menu selection *\n");
printf("* 1.query *\n");
printf("* 2.display *\n");
printf("* 3.update *\n");
printf("* 4.exit *\n");
printf("* ****************************************\n");
printf("* Please enter selection:*");
scanf("%c",&op);
switch(op)
{
case '1':query();
break;
case '2':display();
break;
case '3':update();
break;
case '4':return 0;
}
getchar();
}
void display() //打印文件中通讯录信息,并把读出来得记录放到结果体对象studchange2中。
{
int i;
FILE *pf2;
if((pf2=fopen("studchange.dat","r+b"))==NULL)//判断文件是否打开成功,一条记录一条记录追加
printf("无法打开文件!");
char name[10];
char num[10];
char tel[20];
char age[10];
char sex[10];
//将的信息输出到一个字符串中即可。
int bufferlen=0;
fread(buffer,contentlentotal,1,pf2);//将文件中的记录信息读到缓冲区中。
printf("所有内容的长度是:%d\n",contentlentotal);
printf("所有的记录信息是:%s\n",buffer);
printf("**************** 通讯录 ******************\n");
printf("姓名 学号 电话 年龄 性别\n");
for(i=0;i <N;i++) //按照索引从文件中读出相应的记录,并把该记录复制给相应的结构体变量存储,便于其他操作。
{
int j;//指向buffer中各个字符信息
strcopy(name,buffer,bufferlen,studindex[i].namelen);//将记录的一个属性提取出来
[color=#FF0000] sprintf(studchange2[i].name,name);[/color]
bufferlen+=studindex[i].namelen;
strcopy( num,buffer,bufferlen,studindex[i].numlen);//将记录的一个属性提取出来
[color=#FF0000]sprintf(studchange2[i].num,num);[/color]
bufferlen+=studindex[i].numlen;
strcopy(tel,buffer,bufferlen,studindex[i].tellen);//将记录的一个属性提取出来
[color=#FF0000]sprintf(studchange2[i].tel,tel);[/color]
bufferlen+=studindex[i].tellen;
strcopy( age,buffer,bufferlen,studindex[i].agelen);//将记录的一个属性提取出来
[color=#FF0000]sprintf(studchange2[i].age,age);[/color]
bufferlen+=studindex[i].agelen;
strcopy( sex,buffer,bufferlen,studindex[i].sexlen);//将记录的一个属性提取出来
[color=#FF0000]sprintf(studchange2[i].sex,sex);[/color]
bufferlen+=studindex[i].sexlen;
printf("%s,%s,%s,%s,%s\n",studchange2[i].name,studchange2[i].num,studchange2[i].tel,studchange2[i].age,studchange2[i].sex);
printf("\n");
}//for循环
}//函数体
void query()
{
switch(method)
{
case 1:
printf("请输入要查询的name:\n");
scanf("%s",&name);
//printf("看看比较结果是:%d\n",strcmp(studchange2[0].name,name));
for(i=0;i <N;i++)
{ //首先将信息提取出
[color=#FF0000]if(!strcmp(studchange2[i].name,name))
{
printf("name:%s\n",studchange2[i].name);
printf("num:%s\n",studchange2[i].num);
printf("tel:%s\n",studchange2[i].tel);
printf("age:%s\n",studchange2[i].age);
printf("sex:%s\n",studchange2[i].sex);
printf("\n");
}[/color]
}
break;
[/code]
[解决办法]
[解决办法]
[解决办法]
- C/C++ code
#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 1typedef struct studentchange//定义结构体,将student中的定长记录改成变长记录{ char name[10]; char num[10]; char tel[20]; char age[3]; char sex[2];}stud;struct studentindex { int namelen; int numlen; int tellen; int agelen; int sexlen; int toallen; }studindex[N];stud studchange2[N]; char buffer[1024];int contentlen; int contentlentotal=0; void strcopy(char a[],char b[],int n,int m);int main(){ char content[100]; int op; int i; stud stud[]= { "Li","1001","18810366100","18","f", "Fun","1002","18810366101","19","m", "Wang1","1003","18810366102","17","f", "hei","1004","18810366103","18","f", "Gao","1005","18810366104","19","m", "Yu","1006","18810366105","17","f", "Feng","1007","18810366103","18","f", "Dou","1008","18810366104","19","m", "Wang2","1009","18810366105","17","f" , "Er","1010","18810366103","18","f", "San","1011","18810366104","19","m", "Zhao","1012","18810366105","17","f", "Qian","1013","18810366103","18","f", "Sun","1014","18810366104","19","m", "Li2","1015","18810366105","17","f", "Zhou","1016","18810366103","18","f", "Zheng","1017","18810366104","19","m", "Zhu","1018","18810366105","17","f" , "Xiaobai","1019","18810366103","18","f", "Meng","1020","18810366105","17","f" }; FILE *pf; if((pf=fopen("studchange.dat","ab+"))==NULL) //判断文件是否打开成功,一条记录一条记录追加 printf("无法打开文件!"); for(i=0;i<N;i++) { studindex[i].namelen=strlen(stud[i].name); studindex[i].numlen=strlen(stud[i].num); studindex[i].tellen=strlen(stud[i].tel); studindex[i].agelen=strlen(stud[i].age); studindex[i].sexlen=strlen(stud[i].sex); studindex[i].toallen=studindex[i].namelen+studindex[i].numlen+studindex[i].tellen+studindex[i].agelen+studindex[i].sexlen; strcpy(content,stud[i].name); strcat(content,stud[i].num); strcat(content,stud[i].tel); strcat(content,stud[i].age); strcat(content,stud[i].sex); printf("总计%d条记录的信息为:%s\n",i+1,content); contentlen=strlen(content);//一条记录的长度 fwrite(content,contentlen,1,pf);//将所有的记录写入文件中 contentlentotal+=contentlen; contentlen=0; } fclose(pf); printf("\n"); void query(); void display(); void update(); display(); while(1) { printf("* Menu selection *\n"); printf("* 1.query *\n"); printf("* 2.display *\n"); printf("* 3.update *\n"); printf("* 4.exit *\n"); printf("* ****************************************\n"); printf("* Please enter selection:*"); scanf("%d",&op); switch(op) { case 1:query(); break; case 2:display(); break; case 3:update(); break; case 4:return 0; } getchar(); } return 0; }void display() //打印文件中通讯录信息,并把读出来得记录放到结果体对象studchange2中。{ int i; FILE *pf2; if((pf2=fopen("studchange.dat","r+b"))==NULL)//判断文件是否打开成功,一条记录一条记录追加 printf("无法打开文件!"); char name[10]; char num[10]; char tel[20]; char age[10]; char sex[10]; //将的信息输出到一个字符串中即可。 int bufferlen=0; fread(buffer,contentlentotal,1,pf2);//将文件中的记录信息读到缓冲区中。 printf("所有内容的长度是:%d\n",contentlentotal); printf("所有的记录信息是:%s\n",buffer); printf("**************** 通讯录 ******************\n"); printf("姓名 学号 电话 年龄 性别\n"); for(i=0;i<N;i++) { strcopy(name,buffer,bufferlen,studindex[i].namelen); memcpy(studchange2[i].name,name,studindex[i].namelen); bufferlen+=studindex[i].namelen; strcopy( num,buffer,bufferlen,studindex[i].numlen); memcpy(studchange2[i].num,num,studindex[i].numlen); bufferlen+=studindex[i].numlen; strcopy(tel,buffer,bufferlen,studindex[i].tellen); memcpy(studchange2[i].tel,tel,studindex[i].tellen); bufferlen+=studindex[i].tellen; strcopy(age,buffer,bufferlen,studindex[i].agelen); memcpy(studchange2[i].age,age,studindex[i].agelen); bufferlen+=studindex[i].agelen; strcopy( sex,buffer,bufferlen,studindex[i].sexlen); memcpy(studchange2[i].sex,sex,studindex[i].sexlen); bufferlen+=studindex[i].sexlen; printf("%s,%s,%s,%s,%s\n",studchange2[i].name,studchange2[i].num,studchange2[i].tel,studchange2[i].age,studchange2[i].sex); printf("\n"); }}void query(){ int i; //void see1(struct student *p); // struct student *p; int method; char name_test[10]; char num_test[10]; char tel_test[20]; char age_test[10]; char sex_test[10]; while(1) { printf("* Menu selection *\n"); printf("* 请选择查询方式 *\n"); printf("* 1.按姓名查询 *\n"); printf("* 2.按学号查询 *\n"); printf("* 3.按电话查询 *\n"); printf("* 4.按年龄查询 *\n"); printf("* 5.按性别查询 *\n"); printf("* 6.返回主菜单 *\n"); printf("* *********************************************************\n"); scanf("%d",&method); switch(method) { case 1: printf("请输入要查询的name:\n"); scanf("%s",&name_test); //printf("看看比较结果是:%d\n",strcmp(studchange2[0].name,name)); for(i=0;i<N;i++) { //首先将信息提取出 //if(memcmp(studchange2[i].name,name,strlen(name)==0)) // { printf("name:%s\n",studchange2[i].name); printf("num:%s\n",studchange2[i].num); printf("tel:%s\n",studchange2[i].tel); printf("age:%s\n",studchange2[i].age); printf("sex:%s\n",studchange2[i].sex); printf("\n"); // } } break; case 2: printf("* 请输入要查询的学号:\n"); scanf("%s",&num_test); for(i=0;i<N;i++) { if(!strcmp(studchange2[i].num,num_test)) { printf("name:%s\n",studchange2[i].name); printf("num:%s\n",studchange2[i].num); printf("name:%s\n",studchange2[i].tel); printf("age:%s\n",studchange2[i].age); printf("sex:%s\n",studchange2[i].sex); printf("\n"); } } break; case 3: printf("* 请输入要查询的电话\n"); scanf("%s",&tel_test); for(i=0;i<N;i++) { if(!strcmp(studchange2[i].tel,tel_test)) { printf("name:%s\n",studchange2[i].name); printf("num:%s\n",studchange2[i].num); printf("name:%s\n",studchange2[i].tel); printf("age:%s\n",studchange2[i].age); printf("sex:%s\n",studchange2[i].sex); printf("\n"); } } break; case 4: printf("* 请输入要查询的年龄\n"); scanf("%s",&age_test); for(i=0;i<N;i++) { //首先将信息提取出来 if(!strcmp(studchange2[i].age,age_test)) { printf("name:%s\n",studchange2[i].name); printf("num:%s\n",studchange2[i].num); printf("name:%s\n",studchange2[i].tel); printf("age:%s\n",studchange2[i].age); printf("sex:%s\n",studchange2[i].sex); printf("\n"); } } break; case 5: printf("* 请输入要查询的性别\n"); scanf("%s",&sex_test); printf("姓名 学号 电话 年龄 性别\n"); for(i=0;i<N;i++) { if(!strcmp(studchange2[i].sex,sex_test)) { printf("%s,%s,%s,%s,%s",studchange2[i].name,studchange2[i].num,studchange2[i].tel,studchange2[i].age,studchange2[i].sex); printf("\n"); } } break; default:return; } } } //将字符数组第m个到第n个字符copy到另外一个字符数组中 void strcopy(char a[],char b[],int n,int m) { memcpy(a,&b[n],m); a[m]='\0'; } void update() {}