修改代码#include <stdio.h>#include <string.h>int countSubstring(char *str, char *substr){ int count = 0; int len1 = strlen(str), len2 = strlen(substr); if(len1 < len2){ return count; } for(int i = 0; i <= len1 - len2; i++){ if(strncmp(str + i, substr, len2) == 0){ count++; } } return count;}int main(){ char str[100], substr[100]; printf("请输入字符串:"); scanf("%s", str); printf("请输入子串:"); scanf("%s", substr); int count = countSubstring(str, substr); printf("字符串%s中出现子串%s的次数为:%d\n", str, substr, count); return 0;}
时间: 2023-06-10 12:04:45 浏览: 186
需要知道需要修改哪个代码,并根据需求进行相应的改动。常见的修改方式包括修改变量、修改函数、修改逻辑判断等。在修改代码之前需要充分理解原有代码的结构和作用,以避免引入不必要的错误和问题。同时,在修改完成后需要进行测试和调试,确保修改后的代码能够正常运行并符合预期。
相关问题
基于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 ) ); }
首先,代码中使用了过时的函数 `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`,更加准确地表达了函数的作用;同时使用了指针遍历字符串,减少了内存开销。
#include <stdio.h> #include <string.h> int main() { int substr(char*, char*); char str[100], sub[100]; gets(str); // 输入字符串 gets(sub); // 输入子字符串 int num = substr(str, sub); // 调用函数计算出现次数 printf("%d", num); return 0; } int substr(char *str, char *substr) { // 计算子字符串出现次数 int count = 0; while (*str != '') {// 当读取到字符串末尾时退出循环 char *p1 = str, *p2 = substr; // 定义指针指向字符串首地址 while (*p2 != '' && *p1 == *p2) { // 当子字符串指针p2没有移动到末尾时,与原字符串指针取的值相等, // 即表示子字符串有字符和原字符串相等, 指针依次后移继续判断下一位是否相等 p1++; p2++; } if (*p2 == '') // 若子字符串指针移动到了末尾,即说明上一步完整循环了子字符串,子字符串在原字符串中出现了一次 count++; str++; // 原字符串后移,从下一位继续判断子字符串是否出现 } return count; }如何看懂该程序
这是一个 C 语言程序,主要实现的功能是计算一个字符串中另一个子字符串出现的次数。
程序分为两个部分:
1. main 函数:获取用户输入的字符串和子字符串,并调用 substr 函数计算出现次数,最终输出结果。
2. substr 函数:该函数接收两个参数,分别为指向原字符串和子字符串的指针。函数内部使用两个指针 p1 和 p2 分别指向原字符串和子字符串的首地址,然后逐个比较两个指针所指向的字符是否相等,如果相等则两个指针都后移,否则只有原字符串的指针后移。当子字符串的指针移动到了末尾时,说明子字符串已经完整地匹配了一次原字符串,于是计数器加一,原字符串的指针也向后移动一个字符,继续匹配下一次。当原字符串的指针移动到了末尾时,说明整个字符串已经匹配完成,函数返回计数器的值即可。
需要注意的是,该程序使用了 gets 函数读取用户的输入,这个函数在最新的 C 语言标准中已经被废弃,因为它可能导致缓冲区溢出等安全问题。建议使用 fgets 函数代替 gets 函数。
阅读全文