写代码
写代码
1-1
typedef struct
{
char* ch;
int length;
}string;
typedef int status;
status Assign(string* str, char* chars);
status Clear(string* str);
int Length(string* str);
status Concat(string* res, string* s1, string* s2);
status Substr(string* res, string* str, int pos, int len);
void Write(string * res);
本题要求实现一些接口, 接口定义如上。
按照课本上的约定,不存储 '\0' 例如 "HELLO" , 我们给 char* ch 开辟了五个字节的空间, 如果我们使用 string->ch[5] 就会访问到非法内存,在 pta 这样的平台上可能就会出现段错误

status Assign(string* str, char* chars){
if(str->ch) Clear(str);
/*
如果不 Clear , 会怎么样 ?
A: 如果不 Clear, 会导致原先的 str->ch 这一段内存再也无法回收, 因为我们已经没有办法找到它了, 这就是所谓的 ’内存泄漏‘
虽然不 Clear 也没有关系, 在 PTA 上也能拿满分
*/
int len = strlen(chars);
str->ch = (char*)malloc(len * sizeof(char));
memcpy(str->ch, chars, len * sizeof(char));
str->length = len;
}
status Clear(string* str){
if(str->ch){
free(str->ch);
str->ch = NULL;
str->length = 0;
}
}
int Length(string* str){
return str->length;
/*
这里如果传进的是空指针会怎么样 ?
可能会导致段错误
虽然这些隐患都不会影响 PTA 上的得分, 但是还是需要具有发现这些隐患的能力
*/
}
status Concat(string* res, string* s1, string* s2){
if(res->ch) Clear(res);
res->ch = (char*) malloc(s1->length + s2->length);
int curIndex = 0;
for(int i = 0;i < s1->length;i++){
res->ch[curIndex++] = s1->ch[i];
}
for(int i = 0;i < s2->length;i++){
res->ch[curIndex++] = s2->ch[i];
}
/*
malloc申请的内存并不能初始化, 不保证申请的空间都初始化成 0
*/
res->length = s1->length + s2->length;
}
status Substr(string* res, string* str, int pos, int len){
int ed = pos + len - 1; //[pos, ed]
if(str == NULL || ed < pos || pos < 0 || ed >= str->length){
return 0;
}
if(res->ch) Clear(res);
res->ch = (char*) malloc(len);
int curIndex = 0;
for(int i = pos;i <= ed;i++){
res->ch[curIndex++] = str->ch[i];
}
res->length = len;
}

浙公网安备 33010602011771号