下面的代码总是返回匹配的子字符串的数量为零。代码中没有错误,我不确定我在哪里逻辑错误。
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,len ,k ,count, num ;
char str[100],sub[100],comp[100] ;
// sub is the sub string .
printf("Please enter the string") ;
gets(str) ;
printf("Enter the substring to be searched for") ;
gets(sub) ;
len=strlen(sub) ;
for ( i=0 ; i < strlen(str) - len ; i++ )
//Goes till length of string - length of sub string so that all characters can be compared.
{
num = i + len ;
for ( j=i,k=0 ; j<num ; j++, k++ )
//Loop to store each sub string in an array comp.
{
comp[k]=str[j] ;
}
if ( strcmp(comp,sub) == 0 )
{ count++ ; }
}
printf("no of occurances is:%d",count) ;
return 0 ;
}
答案 0 :(得分:2)
正如评论中所提到的,在构建comp
时,您不会在结尾处添加终止空字节。由于comp
的其余部分未初始化,因此在调用strcmp
时调用未定义的行为。
在内部for
循环的末尾添加空字节将解决问题:
for ( j=i,k=0 ; j<num ; j++, k++ )
//Loop to store each sub string in an array comp.
{
comp[k]=str[j] ;
}
comp[k] = '\0';
实际上,不要创建单独的子字符串,只需使用strncmp
,它可以比较一定数量的字符:
for ( i=0 ; i < strlen(str) - len ; i++ )
//Goes till length of string - length of sub string so that all characters can be compared.
{
if ( strncmp(&str[i],sub,strlen(sub)) == 0 )
{ count++ ; }
}
此外,请勿使用gets
,因为这会导致缓冲区溢出。请改用fgets
。
答案 1 :(得分:0)
尝试从此处更改for循环:
for ( i=0 ; i < strlen(str) - len ; i++ )
到
for ( i=0 ; i <= strlen(str) - len ; i++ )