分析测试这段代码有几处缺陷可以该进并举例int findr(char* str, char* sub) { char *i,*j,*k,*n; int l,m; int len_str,len_sub; len_str = 0; len_sub = 0; i = str; j = sub; while(*i != '\0') { i++; len_str++; } i--; while(*j != '\0') { j++; len_sub++; } j--; n = j; for(l = len_str;l >= len_str - len_sub + 1;l--) {k = i; for(m = 1;m <= len_sub; m++) {if(*k == *j) { k--; j--; } else break; } if(m > len_sub) break; i--; j = n; } if(l < len_str - len_sub + 1) return -1; else return (l - len_sub+1);}
时间: 2023-12-05 18:04:43 浏览: 106
这段代码可能存在以下缺陷:
1. 变量命名不规范,不易读懂,例如变量i、j、k等。
2. 函数参数为char*类型时,应该考虑指针是否为空的情况,否则在访问指针所指向的空间时可能会出现非法访问。
3. 函数中未对输入的字符串长度做判断,当输入的字符串长度为0时,程序可能会出现异常。
4. 函数中存在一些冗余的代码,例如计算字符串长度时可以使用strlen函数等。
5. 函数中的算法实现可以更简洁,例如可以使用指针来实现字符串匹配。
6. 函数返回值只有-1和非负整数两种情况,无法体现具体错误信息。
下面是改进后的代码:
```
int find_substring(char* str, char* sub) {
if (str == NULL || sub == NULL) {
return -1;
}
int len_str = strlen(str);
int len_sub = strlen(sub);
if (len_str == 0 || len_sub == 0 || len_sub > len_str) {
return -1;
}
char* p = strstr(str, sub);
if (p == NULL) {
return -1;
}
return (int)(p - str);
}
```
改进后的代码使用了strstr函数查找子串,可以更简洁地实现字符串匹配。同时,增加了对参数为空和字符串长度为0的处理,返回值也更加明确。
阅读全文