2012-12-28 3 views
1

У меня есть почти хорошая рабочая программа для подсчета слов со стандартного ввода. Слово, которое нужно считать, является аргументом программы.Программа подсчета слов c

Проблема в том, что я использую пробел, чтобы видеть слово, но я также должен учитывать внутри самого слова. Пример: если мой вход аа аааа #EOF, и я хочу, чтобы подсчитать аа результат должен быть 4. Мой код результата 2.

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 


int word_cnt(const char *s, char *argv[]) 
{ 
    int cnt = 0; 

    while(*s != '\0') 
    { 
     while(isspace(*s)) 
     ++s; 
     if(*s != '\0') 
     { 
      if(strncmp(s, argv[1], strlen(argv[1])) == 0) 
      ++cnt; 

      while(!isspace(*s) && *s != '\0') 
      ++s; 
     } 
    } 

    return cnt; 
} 

int main(int argc, char *argv[]) 
{ 
    char buf[1026] = {'\0'}; 
    char *p="#EOF\n"; 
    int tellen = 0; 

    if (argc != 2) 
    { 
     printf("Kan het programma niet uitvoeren, er is geen programma argument gevonden\n"); 
     exit(0); 
    } 

    while((strcmp(buf, p) !=0)) 
    { 
     fgets (buf, 1025, stdin); 
     tellen += word_cnt(buf, argv); 
    } 

    printf("%d", tellen); 

    return 0; 
} 
+2

Какой? У вас есть два слова: 'aa' и' aaaa' –

+0

', если мой вход aa aaaa #EOF, и я хочу считать aa, результат должен быть 4' Зачем должен быть ваш результат 4? – Falmarri

+0

из-за слова aaaa на самом деле имеет 3 раза aa, первый - ** aa ** aa, второй a ** aa ** a, а третий, aa ** aa **. – user1933355

ответ

2
int word_cnt(const char *s, char *argv[]) 
{ 
    int cnt = 0; 
    int len = strlen(argv[1]); 
    while(*s) 
    { 
      if(strncmp(s, argv[1], len) == 0) 
       ++cnt; 

      ++s; 
    } 

    return cnt; 
} 
+0

Спасибо, это было действительно очень легко и понятно. Я фактически экспериментировал с размером проверяющих слов. – user1933355

3

Где у вас есть это:

if(strncmp(s, argv[1], strlen(argv[1])) == 0) 
    ++cnt; 

while(!isspace(*s) && *s != '\0') 
    ++s; 

Попробуйте это :

/* if it matches, count and skip over it */ 
while (strncmp(s, argv[1], strlen(argv[1])) == 0) { 
    ++cnt; 
    s += strlen(argv[1]); 
} 

/* if it no longer matches, skip only one character */ 
++s; 
+0

Просто прочитайте комментарии выше. Чтобы он дал вам 4 для aa aaaa, ища аа, добавьте только 1, если он совпадает, вместо того, чтобы добавить полную длину матча. То, что я покажу, даст вам 3. –

1

Попробуйте strncmp() в цикле.

/* UNTESTED */ 
unsigned wc(const char *input, const char *word) { 
    unsigned count = 0; 
    while (*input) { 
     if (strncmp(input, word, strlen(word)) == 0) count++; 
     input++; 
    } 
    return count; 
} 
Смежные вопросы