Отрегулируйте вывод на основе количества подстрок в строке в массиве 2d char - PullRequest
0 голосов
/ 16 февраля 2020

Я читаю несколько строк из файла и пытаюсь напечатать каждую строку, содержащую определенный набор ключевых слов. Прямо сейчас мой код просто ищет первое вхождение ключевого слова в строке, если он его найдет, он напечатает это ключевое слово и эту строку с номером строки. Но я пытаюсь сделать так, чтобы, если строка содержала более одного вхождения ключевого слова, в печатном выводе рядом с номером строки присутствовал символ звездочки. Я перепробовал много разных подходов, и ничего не работает. Вот мой код:

for(i = 0; i < wordCount_keyword; i++) {
    for(j = 0; j <= lineCount; j++) {
        if(strstr(inputLines[j], keywords[i]) != NULL) {
            printf("%-*s %s (%d)\n", max_length + 1, keywords_upper[i], inputLines[j], j+1);
        }
    }
}

Вот мой текущий вывод:

CAT       the fish a dog cat dog rabbit (1)
CAT       the fish and cat  (2)
DOG       the fish a dog cat dog rabbit (1)
ELEPHANT  a rabbit or elephant (3)
FISH      the fish a dog cat dog rabbit (1)
FISH      the fish and cat  (2)
RABBIT    the fish a dog cat dog rabbit (1)
RABBIT    a rabbit or elephant (3)

Вот идеально правильный вывод, к которому я стремлюсь:

CAT       the fish a dog cat dog rabbit (1)
CAT       the fish and cat  (2)
DOG       the fish a dog cat dog rabbit (1*)
ELEPHANT  a rabbit or elephant (3)
FISH      the fish a dog cat dog rabbit (1)
FISH      the fish and cat  (2)
RABBIT    the fish a dog cat dog rabbit (1)
RABBIT    a rabbit or elephant (3)

Обратите внимание на разницу будучи звездой рядом с цифрой 1 в конце третьей строки. Какой правильный способ сделать это?

1 Ответ

0 голосов
/ 16 февраля 2020

Поскольку в c нет встроенных функций для подсчета количества вхождений слова в строку, вам нужно написать одну. Допустим, определение функции - «getWordOccurances (char * str, char * toSearch)». Тогда следующий код решит вашу проблему.

for(i = 0; i < wordCount_keyword; i++) {
   for(j = 0; j <= lineCount; j++) {
       int count = getWordOccurances(inputLines[j], keywords[i]);
       if(count > 0) {
           printf("%-*s %s (%d", max_length + 1, keywords_upper[i], inputLines[j], j+1);
           if(count > 1) printf("*)\n");
           else printf(")\n");
       }
   }
}

И функция getWordOccurances (char * str, char * toSearch) может выглядеть следующим образом:

int countOccurrences(char * str, char * toSearch){
    int i, j, found, count;
    int stringLen, searchLen;

    stringLen = strlen(str);      // length of string
    searchLen = strlen(toSearch); // length of word to be searched

    count = 0;

    for(i=0; i <= stringLen-searchLen; i++) {
        /* Match word with string */
        found = 1;
        for(j=0; j<searchLen; j++) {
            if(str[i + j] != toSearch[j]) {
                found = 0;
                break;
            }
        }

        if(found == 1) count++;
    }

    return count;
}

Дайте мне знать, если вы не понимаю какую-либо часть программы. Удачного кодирования!

...