The problem with this function is that it looks after all the substrings, but not for words like for example if I'm looking for "hi" within "hifive to to evereyone" it returns 1
int HowManyString(char *satz,char *word) {
int coun = 0;
while (strlen(word)<strlen(satz)) {
if (strstr(satz,word)==NULL) {
return coun;
} else {
satz=strstr(satz,word) strlen(word);
if(*(satz)==' '||*(satz)=='\0'){
coun ;
} else {
return coun;
}
}
}
return coun;
}
CodePudding user response:
Using your approach with the standard function strstr
your function can look the following way as shown in the demonstration program below
#include <stdio.h>
#include <string.h>
#include <ctype.h>
size_t HowManyString( const char *s1, const char *s2 )
{
size_t count = 0;
size_t n = strlen( s2 );
for ( const char *p = s1; ( p = strstr( p, s2 ) ) != NULL; p = n )
{
if ( ( p == s1 || isblank( ( unsigned char )p[-1] ) ) &&
( p[n] == '\0' || isblank( ( unsigned char )p[n] ) ) )
{
count;
}
}
return count;
}
int main( void )
{
const char *s1 = "hifive";
const char *s2 = "hi";
printf( "%zu\n", HowManyString( s1, s2 ) );
s1 = "fivehi";
printf( "%zu\n", HowManyString( s1, s2 ) );
s1 = "hi five";
printf( "%zu\n", HowManyString( s1, s2 ) );
s1 = "five hi";
printf( "%zu\n", HowManyString( s1, s2 ) );
}
The program output is
0
0
1
1
If the source string can contain the new line character '\n'
when within the function use isspace
instead of isblank
.
CodePudding user response:
Here is a function that achieves what you are looking for:
int count_words(const char *sentence, const char *word)
{
int counter = 0;
for (const char *p = sentence; *p; p) {
// Skip whitespaces
if (isspace(*p))
continue;
// Attempt to find a match
const char *wp = word, *sp = p;
while (*wp != '\0' && *sp != '\0' && *wp == *sp) {
wp;
sp;
}
// Match found AND a space after AND a space before
if (*wp == '\0' && (isspace(*sp) || *sp == '\0') && (p == sentence || isspace(*(p-1)))) {
counter;
p = sp - 1;
}
// End of sentence reached: no need to continue.
if (*sp == '\0')
return counter;
}
return counter;
}
Usage:
int main(void)
{
const char sentence[] = "I is Craig whoz not me, not him, not you!";
const char word[] = "not";
int occ = count_words(sentence, word);
printf("There are %d occurences.\n", occ);
}
Output:
There are 3 occurences.