2016-01-28 4 views
0

Приведенный ниже код производит смешной вывод 32674 для тестового ввода счетного числа 'aa' в 'aaa'. Как мне исправить это?Найти количество подстрок в строке

#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") ; 
    fgets(str,sizeof(str),stdin) ; 
    printf("Enter the substring to be searched for") ; 
    fgets(sub,sizeof(str),stdin) ; 
    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] ; 
      }   
      comp[k+1]='\0' ; 
      /*A previous suggestion given : comp[k]  
      to be the null character but I dont see how/why? and that is 
      giving a similarly wrong output as well. */ 
     if (strcmp(comp,sub) == 0) 
      { count++ ; } 
    } 
    printf("no of occurances is:%d",count) ; 
    return 0 ; 
} 
+1

это не дает ответа на вопрос, но как насчет использования strstr искать подстроки? должен сделать вещи проще –

ответ

1

два вопроса:.

fgets читает символ новой строки и добавляет его в строку, которая считывается Вам необходимо удалить его:

if (str[strlen(str)-1] == '\n') str[strlen(str)-1]='\0'; 
... 
if (sub[strlen(sub)-1] == '\n') sub[strlen(sub)-1]='\0'; 

При создании подстроки для сравнения, вам «Поставить нулевой ограничитель на одно место слишком далеко:

comp[k+1]='\0' ; 

k уже был увеличен до выходов цикла, поэтому нет необходимости добавлять 1:

comp[k]='\0' ; 
+0

С необычным вводом 'str [strlen (str) -1]' может привести к UB. Предложить http://stackoverflow.com/a/28462221/2410359 – chux

+0

'fgets' always null - завершает заполняемую строку, поэтому использование вышеизложенного сразу после' fgets' должно быть четко определено. – dbush

+2

'fgets()' read, пока не встретит '' \ n''. Это не означает, что если первый символ равен '' \ 0'', перестает считываться. Ввод нулевого символа через 'fgets()' - это хакерский эксплойт, поскольку он приводит к 'str [strlen (str) -1]' -> 'str [-1]'. 'strlen()' останавливается на первом нулевом символе, не обязательно на том, что добавлено 'fgets()', как вы правильно комментировали. – chux

2

count не инициализируется, поэтому напечатанное значение count не является полезным.

int i,j,len ,k ,count, num ; 
count = 0; // add 
... 
{ count++ ; } 
... 
printf("no of occurances is:%d",count) ; 

Предлагайте удаление потенциального \n от конца ввода. может существовать

fgets(str, sizeof str ,stdin); 
str[strcspn(str, "\n")] = '\0'; // add 

Другие вопросы: @dbush