发现查找字符串中给定子字符串的出现次数

时间:2016-01-27 14:00:16

标签: c arrays string loops

下面的代码总是返回匹配的子字符串的数量为零。代码中没有错误,我不确定我在哪里逻辑错误。

#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 ;
}  

2 个答案:

答案 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++ )