Я хочу знать, как посчитать, сколько слов в строке. Я использую strstr для сравнения, и он работает, но работает только один раз

Как это

char buff = "This is a real-life, or this is just fantasy";
char op = "is";

if (strstr(buff,op)){
    count++;
}
printf("%d",count);

И на выходе будет 1, но в предложении есть два «есть», пожалуйста, скажите мне.

0
Jack Savage 15 Окт 2021 в 17:01

2 ответа

Лучший ответ

Для начала вы должны написать объявления хотя бы как

char buff[] = "This is a real-life, or this is just fantasy";
const char *op = "is";

Также, если вам нужно подсчитать слова, вы должны проверить, разделены ли слова пробелами.

Вы можете выполнить задачу следующим образом

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

//...

size_t n = strlen( op );
for ( const char *p = buff; ( p = strstr( p, op ) ) != NULL; p += n )
{
    if ( p == buff || isblank( ( unsigned char )p[-1] ) )
    {
        if ( p[n] == '\0' || isblank( ( unsigned char )p[n] ) )
        {
            count++;
        }
    }
}
printf("%d",count);

Вот демонстрационная программа.

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

int main(void) 
{
    char buff[] = "This is a real-life, or this is just fantasy";
    const char *op = "is";
    size_t n = strlen( op );

    size_t count = 0;

    for ( const char *p = buff; ( p = strstr( p, op ) ) != NULL; p += n )
    {
        if ( p == buff || isblank( ( unsigned char )p[-1] ) )
        {
            if ( p[n] == '\0' || isblank( ( unsigned char )p[n] ) )
            {
                count++;
            }
        }
    }

    printf( "The word \"%s\" is encountered %zu time(s).\n", op, count );

    return 0;
}

Вывод программы

The word "is" is encountered 2 time(s).
0
Vlad from Moscow 15 Окт 2021 в 14:35

Разберите строку в цикле .

Поскольку OP имеет «но их два» есть «в предложении», недостаточно просто искать "is", поскольку это встречается 4 раза, дважды в "This". Код должен проанализировать строку на предмет «слова».

Чувствительность к регистру также вызывает беспокойство.

char buff = "This is a real-life, or this is just fantasy";
char op = "is";

char *p = buff;
char *candidate;
while ((candidate = strstr(p, op)) {
  // Add code to test if candidate is a stand-alone word
  // Test if candidate is beginning of buff or prior character is a white-space.
  // Test if candidate is end of buff or next character is a white-space/punctuation.
  p += strlen(op); // advance
}

На мой взгляд, я бы не стал использовать strstr(), но ищу "слова" с isalpha().

// Concept code
size_t n = strlen(op);
while (*p) {
  if (isalpha(*p)) {  // Start of word
    // some limited case insensitive compare
    if (strnicmp(p, op, n) == 0 && !isalpha(p[n]) {  
      count++;
    }
    while (isalpha(*p)) p++;  // Find end of word
  } else {
    p++;
  }
}
0
chux - Reinstate Monica 15 Окт 2021 в 14:31