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); }