基于C,优化这段代码,并说明有哪些问题:#include <string.h> #include <stdio.h> #define M 81 int fun( char *ss, char *s ) { int i,j,m,n,k=0; char t[M]; n=strlen(s); m=strlen(ss); for(i=0;i<m;i++) {for(j=0;j<n;j++) t[j]=*(ss+j+i); if(strcmp(t,s)==0) k++; } return k; } int main() { char a[M], s[M]; printf( "\nPlease enter a string:" ); gets(a); printf( "\nPlease enter a substring:" ); gets(s); printf( "\nThe counts is: %d\n", fun( a, s ) ); }
时间: 2023-07-16 11:14:04 浏览: 82
首先,代码中使用了过时的函数 `gets`,容易造成缓冲区溢出问题。建议使用安全的替代函数 `fgets`。
其次,在函数 `fun` 中,每次循环都要开辟一个长度为 `n` 的字符数组 `t` 进行子串的比较,浪费了空间。可以直接用指针遍历比较子串和原字符串。
最后,变量命名不太规范,建议改成更具有描述性的名称。
优化后的代码如下:
```c
#include <string.h>
#include <stdio.h>
#define MAX_LEN 81
int countSubstring(char *str, char *subStr) {
int i, j, count = 0;
int len = strlen(str);
int subLen = strlen(subStr);
for (i = 0; i <= len - subLen; i++) {
for (j = 0; j < subLen && *(str + i + j) == *(subStr + j); j++);
if (j == subLen) count++;
}
return count;
}
int main() {
char str[MAX_LEN], subStr[MAX_LEN];
printf("\nPlease enter a string:");
fgets(str, MAX_LEN, stdin);
printf("\nPlease enter a substring:");
fgets(subStr, MAX_LEN, stdin);
printf("\nThe counts is: %d\n", countSubstring(str, subStr));
return 0;
}
```
这里将函数名改为了 `countSubstring`,更加准确地表达了函数的作用;同时使用了指针遍历字符串,减少了内存开销。
阅读全文
相关推荐



















