首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

C实现串赋值时的小疑点,望解惑

2012-03-17 
C实现串赋值时的小问题,望解惑下面是实现StrAssigns()函数的源码:C/C++ code#define ERROR0#define OK1typ

C实现串赋值时的小问题,望解惑
下面是实现StrAssigns()函数的源码:

C/C++ code
#define ERROR        0#define OK        1typedef int    Status;typedef struct{    char *ch;    int     length;}HString;Status StrAssigns(HString *T, char *chars){    int i,length = 0;    char *c = chars;    //if(T->ch != NULL)free(T->ch);    for(i = 0; c[i] != '\0'; i++)length++;    if(length == 0)    {        T->ch = NULL;        T->length = 0;        return OK;    }    T->ch = (char *)malloc(length * sizeof(char));    if(!T->ch)return OVERFLOW;    else    {        for(i = 0; i< length; i++)            T->ch[i] = chars[i];        T->length = length;    }    return OK;}int main(void){    HString S;    StrAssigns(&S,"abc");    printf("%s",S.ch);    }


①打印的时候打印的是"abc ",多了后面的空格,为何?
②注释部分,想要的效果是:如果传来的T已经分配了空间,则释放,再根据chars的长度分配空间。但实际运行时,如果传来的是一个未赋值的char*指针,会出问题。该怎么做?

这是根据严蔚敏写得数据结构中的算法写得

[解决办法]
你可以约定 成员ch是堆地址。ch字符串没有结束符'\0',你可以为HString写一个StrPrint函数,根据长度控制输出。
[解决办法]
问题1 原因,字符串没有以'\0'结束,所有后面多出什么字符不可预测。空格只是其中一种情况而已。
 T->ch = (char *)malloc(length * sizeof(char));
修改为
 T->ch = (char *)malloc((length+1)* sizeof(char));
同时最后
T->ch[length]=0;

问题2
 把HString 从struct修改为class
在构造中赋值ch=NULL
如果要再严格一些,就把ch变成private,malloc,free都在类里面操作。
[解决办法]
C/C++ code
#include<stdio.h>#include<stdlib.h>#define ERROR        0#define OK        1#define OVERFLOW  0typedef int    Status;typedef struct{    char *ch;    int     length;}HString;Status StrAssigns(HString *T, char *chars){    int i,length = 0;    char *c = chars;        //if(T->ch != NULL)free(T->ch);    for(i = 0; c[i] != '\0'; i++)        length++;    if(length == 0)    {        T->ch = NULL;        T->length = 0;        return OK;    }        T->ch = (char *)malloc(length * sizeof(char)+1);  //增加个 字节单元  来存放字符串的结束符    if(!T->ch)        return OVERFLOW;    else    {        for(i = 0; i< length; i++)            T->ch[i] = chars[i];        T->ch[i]=chars[i];          //字符串的结束符        T->length = length;    }    return OK;}int main(void){    HString S;    StrAssigns(&S,"abc");        printf("%s",S.ch);    } 

热点排行