检查下面的代码,找出错误并修改:#include<stdio.h> #include<string.h> int substring(char *str,char *sub) { int count=0,counti,countj; for(counti=0;counti<strlen(str);counti++) { for(countj=0;countj<strlen(sub);countj++) { if(str[counti+countj]!=sub[countj]) break; } if(countj==strlen(sub)) count++; } return count; } int main() { char str[50],sub[10]; gets(str); gets(sub); printf("%d\n",substring(str,sub)); return 0; }
时间: 2024-01-28 18:03:20 浏览: 336
C字符串处理实用PPT学习教案.pptx
这段代码的问题在于使用了不安全的函数`gets()`,它没有限制输入的字符串长度,可能导致缓冲区溢出漏洞。建议使用更安全的函数`fgets()`代替。
修改后的代码如下:
```
#include <stdio.h>
#include <string.h>
int substring(char *str, char *sub) {
int count = 0, counti, countj;
for (counti = 0; counti < strlen(str); counti++) {
for (countj = 0; countj < strlen(sub); countj++) {
if (str[counti + countj] != sub[countj])
break;
}
if (countj == strlen(sub))
count++;
}
return count;
}
int main() {
char str[50], sub[10];
fgets(str, 50, stdin);
fgets(sub, 10, stdin);
str[strcspn(str, "\n")] = '\0'; // 去掉字符串末尾的换行符
sub[strcspn(sub, "\n")] = '\0'; // 去掉字符串末尾的换行符
printf("%d\n", substring(str, sub));
return 0;
}
```
修改后的代码中使用了`fgets()`函数来获取输入字符串,并通过`strcspn()`函数去掉输入字符串末尾的换行符。这样可以避免缓冲区溢出漏洞。
阅读全文