写代码

写代码

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 这样的平台上可能就会出现段错误

image-20211026185525033

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;
}
posted @ 2021-10-26 19:09  usr_void  阅读(240)  评论(0)    收藏  举报