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 08:02:12 浏览: 156
这是一段 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 find(char* str, char* sub) {
这是一个函数声明的开头,其中包含函数名为 find,参数列表中包含两个指向字符的指针类型参数 str 和 sub,函数返回值类型为 int。如果要实现这个函数,需要在函数声明后加上函数体,函数体中包含具体的实现代码。下面是一个可能的实现:
```c
int find(char* str, char* sub) {
int i, j, k;
int len_str = strlen(str);
int len_sub = strlen(sub);
for (i = 0; i <= len_str - len_sub; i++) {
for (j = i, k = 0; k < len_sub && str[j] == sub[k]; j++, k++);
if (k == len_sub) {
return i;
}
}
return -1;
}
```
这个实现使用了暴力匹配算法,时间复杂度为 O(nm),其中 n 和 m 分别为主串和子串的长度。实际上,可以使用更高效的字符串匹配算法来实现这个函数。
阅读全文