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

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

2012-03-07 
指针变量中的乱码问题?下面是我的代码:C/C++ code#includestdio.h#includestdlib.h#includestring.h

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

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'为止.

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

热点排行