char *i, *j, *k, *n; int l, m; int len_str = 0; int len_sub = 0; i = str; j = sub; if(*str=='\0') { return -1; } while (*i != '\0') { i++; len_str++; } i--; while (*j != '\0') { j++; len_sub++; } j--; n = j; for (l = len_str - 1; l >= len_sub - 1; l--) { k = i; for (m = 1; m <= len_sub; m++) { if (*k != *j) { break; } k--; j--; } if (m > len_sub) { break; } i--; j = n; } if (l < len_sub - 1) { return -1; } else { return (l - len_sub + 1); }
时间: 2024-01-22 18:02:12 浏览: 157
这是一段 C 语言代码,实现了一个字符串查找算法。该算法的功能是在一个字符串 str 中查找另一个字符串 sub,如果找到了,则返回 sub 在 str 中最后一次出现的位置,如果没有找到,则返回 -1。
具体实现过程是:先分别计算出 str 和 sub 的长度,然后从 str 的末尾开始向前遍历,每次取出长度与 sub 相等的子串与 sub 进行比较,如果相等,则返回当前位置,否则继续向前遍历。如果遍历完整个字符串都没有找到,则返回 -1。
需要注意的是,该算法中的指针运算较为复杂,需要仔细理解。另外,该算法只能查找 sub 在 str 中最后一次出现的位置,如果需要查找全部出现位置,则需要对算法进行改进。
相关问题
分析测试这段代码有几处缺陷可以该进并举例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);}
这段代码可能存在以下缺陷:
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的处理,返回值也更加明确。
int frequency(char* substr, char* str) { // 请在此添加代码,实现函数frequency /********** Begin *********/ int k = 1, sum = 0; int l = strlen(str); while (k) { char* p = strstr(substr, str); if (p != nullptr) { for (int i = 0; i < l; i++) { *p = '0'; p++; } sum++; } else k = 0; } return sum; }
这段代码有一些问题,需要进行修改。首先,strstr 函数的参数顺序应该是 str 在前,substr 在后;其次,在循环中应该使用 str 而不是 substr 进行查找;最后,在循环中应该将 p 指向下一个可能的匹配位置,而不是直接将其向后移动 l 个位置。
修改后的代码如下:
```
int frequency(char* substr, char* str) {
int count = 0;
int len_sub = strlen(substr);
char* p = str;
while ((p = strstr(p, substr)) != NULL) {
count++;
p += len_sub;
}
return count;
}
```
这个函数使用了 strstr 函数在长串中查找子串出现的位置,并将 p 指向下一个可能的匹配位置,直到找不到为止。最后返回子串出现的次数。
阅读全文