读书人

指针变量中的乱码有关问题

发布时间: 2012-03-07 09:13:51 作者: rapoo

指针变量中的乱码问题?
下面是我的代码:

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;studchange2[i].name = (char *)malloc(10); //为结构体的每个成员分配内存空间        studchange2[i].num = (char *)malloc(10);         studchange2[i].tel = (char *)malloc(20);         studchange2[i].age = (char *)malloc(10);         studchange2[i].sex = (char *)malloc(10);}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++) //按照索引从文件中读出相应的记录,并把该记录复制给相应的结构体变量存储,便于其他操作。{    /*用strcpy之前,先把相关的字段用memset全部置为0,比如memset(stud.name, 0, 你用malloc给stud.name分配的字节数);这样就OK了。 */memset(studchange2[i].name,'\0',strlen(name)); strcopy(name,buffer,bufferlen,studindex[i].namelen);//将记录的一个属性提取出来memcpy(studchange2[i].name, name, strlen(name));//将name中的内容拷贝到给studchange2[i].name bufferlen+=studindex[i].namelen; memset(studchange2[i].num,'\0',strlen(num));strcopy( num,buffer,bufferlen,studindex[i].numlen);//将记录的一个属性提取出来memcpy(studchange2[i].num, num, strlen(num));//将name中的内容拷贝到给studchange2[i].name //studchange2[i].num=num;//将该条记录的该属性保存起来。 bufferlen+=studindex[i].numlen;  memset(studchange2[i].tel,'\0',strlen(tel));strcopy(tel,buffer,bufferlen,studindex[i].tellen);//将记录的一个属性提取出来memcpy(studchange2[i].tel,tel, strlen(tel));//将name中的内容拷贝到给studchange2[i].name //studchange2[i].tel=tel;//将该条记录的该属性保存起来。 bufferlen+=studindex[i].tellen;   memset(studchange2[i].age,'\0',strlen(age));strcopy( age,buffer,bufferlen,studindex[i].agelen);//将记录的一个属性提取出来memcpy(studchange2[i].age,age, strlen(age));//将name中的内容拷贝到给studchange2[i].namebufferlen+=studindex[i].agelen; memset(studchange2[i].sex,'\0',strlen(sex));strcopy( sex,buffer,bufferlen,studindex[i].sexlen);//将记录的一个属性提取出来memcpy(studchange2[i].sex,sex, strlen(sex));//将name中的内容拷贝到给studchange2[i].namebufferlen+=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循环}//函数体//将字符数组第m个到第n个字符copy到另外一个字符数组中void strcopy(char a[],char b[],int n,int m){  memcpy(a,&b[n],m);  a[m]='\0';} 




我用display()把所有的记录信息输出来,显示结果如下:

**************** 通讯录 ******************
姓名 学号 电话 年龄 性别
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
屯屯屯屯妄?

从输出结果可以看出:】
除了第一条结果是正常的,其他的结果中都有乱码,怎么才能把乱码去掉了???
请高手相助!!!

[解决办法]
指针乱码一定是指针指向了意料之外的地址;从输出来看,你是不是某个字符串最后一位忘记赋值为'\0'了
[解决办法]
改了下, 因为你分配内存没初始化为0
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];//存储从文件中读出来的记录信息//定义一个为一页大小的块char g_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;    //定义通讯录    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;                studchange2[i].name = (char *)malloc(10); //为结构体的每个成员分配内存空间        studchange2[i].num = (char *)malloc(10);         studchange2[i].tel = (char *)malloc(20);         studchange2[i].age = (char *)malloc(10);         studchange2[i].sex = (char *)malloc(10);        ///////////////////////////////////////////////这里要初始化为0        memset(studchange2[i].name, 0, 10);        memset(studchange2[i].num, 0, 10);        memset(studchange2[i].tel, 0, 20);        memset(studchange2[i].age, 0, 10);        memset(studchange2[i].sex, 0, 10);    }    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':            printf("query\n");            //query();            break;        case '2':            display();            break;        case '3':            //update();            printf("update\n");            break;        case '4':return 0;        }                getchar();    }    return 0;    }        void display()      //打印文件中通讯录信息,并把读出来得记录放到结果体对象studchange2中。{    int i;    FILE *pf2;    if((pf2=fopen("studchange.dat","r+b"))==NULL)//判断文件是否打开成功,一条记录一条记录追加        printf("无法打开文件!");        //将的信息输出到一个字符串中即可。    int bufferlen=0;    memset(g_buffer, 0, sizeof(g_buffer));    fread(g_buffer,contentlentotal,1,pf2);//将文件中的记录信息读到缓冲区中。    printf("所有内容的长度是:%d\n",contentlentotal);    printf("所有的记录信息是:%s\n",g_buffer);            printf("****************            通讯录       ******************\n");    printf("姓名       学号      电话       年龄        性别\n");    char *buffer = g_buffer;    for(i=0;i<N;i++) //按照索引从文件中读出相应的记录,并把该记录复制给相应的结构体变量存储,便于其他操作。    {        strncpy(studchange2[i].name, buffer, studindex->namelen);        buffer += studindex->namelen;        strncpy(studchange2[i].num, buffer, studindex->numlen);        buffer += studindex->numlen;        strncpy(studchange2[i].tel, buffer, studindex->tellen);        buffer += studindex->tellen;        strncpy(studchange2[i].age, buffer, studindex->agelen);        buffer += studindex->agelen;        strncpy(studchange2[i].sex, buffer, studindex->sexlen);        buffer += studindex->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循环        }//函数体    //将字符数组第m个到第n个字符copy到另外一个字符数组中void strcopy(char a[],char b[],int n,int m){    memcpy(a,&b[n],m);    a[m]='\0';} 


[解决办法]
拷贝字符串的时候并没有把'\0'拷贝进去, 而且你初始化的时候也没有初始化为0, 所以造成乱码。
1.将分配后的内存初始化为0.
或者
2.拷贝完字符串后自己在字符串末尾添加一个'\0'
[解决办法]

探讨

拷贝字符串的时候并没有把'\0'拷贝进去, 而且你初始化的时候也没有初始化为0, 所以造成乱码。
1.将分配后的内存初始化为0.
或者
2.拷贝完字符串后自己在字符串末尾添加一个'\0'

[解决办法]
malloc 分配的空间初始化了吗? 可以用 calloc 代替

字符串结尾 的 '\0'

越界否,是否覆盖了 '\0'

[解决办法]
字符串以'\0'为结束标志, 你要是没有的话,

他就一直输出直到在不远处或远处找到'\0'为止.

一般就在不远处. 呵呵.....

读书人网 >C语言

热点推荐