Home > OS >  I cant count more than one charachtar
I cant count more than one charachtar

Time:06-11

I'm trying to build a function that counts how many sentences there are in a text depending on the "?","!", and "." to decide the end of the sentence, but for some reason no matter how many of them there are the function doesn't count more than one and only if it was at the end of the whole text.

This is the function:

int count_sentences(string text)
{
 int count = 0;
for (int i = 0; i < strlen(text); i  ){

if (strcmp(&text[i], "?") == 0 || strcmp(&text[i], "!") == 0 || strcmp(&text[i], ".") == 0)
    {
    count  = 1;

    }
    }
   return count;
    }

CodePudding user response:

strcmp is for comparing null terminated strings. You just want to compare characters.

Let's assume text contains ".ABC".

During the first iteration (when ius 0), &text[i] points to the string ".ABC" and strcmp(&text[i], ".") actually compares the string ".ABC" to the string "." and they are, of course, not equal.

Your if statement should be like this:

if ((text[i] == '?') || text[i] == '!') || text[i] == '.'))

CodePudding user response:

Using the function strcmp

if (strcmp(&text[i], "?") == 0 || strcmp(&text[i], "!") == 0 || strcmp(&text[i], ".") == 0)

does not make a sense. The expression in the if statement will be evaluated to true only for the last character in the string text provided that the last character is equal to one of the characters '?', '!' and '.'.

Instead you should use standard C functions strspn and strcspn. For example

size_t count_sentences( string text )
{
    const char *delim = "?!.";

    size_t count = 0;

    for ( text  = strcspn( text, delim ); *text != '\0'; text  = strcspn( text, delim ) )
    {
          count;
        text  = strspn( text, delim );
    }

    return count;
}

The function will return 1 for example for the string "Executing...". Indeed there is only one statement though there are three characters '.'.

Here is a demonstration program.

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

typedef char *string;

size_t count_sentences( string text )
{
    const char *delim = "?!.";

    size_t count = 0;

    for ( text  = strcspn( text, delim ); *text != '\0'; text  = strcspn( text, delim ) )
    {
          count;
        text  = strspn( text, delim );
    }

    return count;
}

int main(void) 
{
    string text = "Strange... Why are you using strcmp?! Use strspn and strcspn!!!";

    printf( "The text\n\"%s\"\ncontains %zu sentences.\n",
        text, count_sentences( text ) );

    return 0;
}

The program output is

The text
"Strange... Why are you using strcmp?! Use strspn and strcspn!!!"
contains 3 sentences.

CodePudding user response:

The pointer you passed in causes you to compare the following characters. Use string[index] == '?' to compare individual characters.

    /* Compare S1 and S2, returning less than, equal to or
   greater than zero if S1 is lexicographically less than,
   equal to or greater than S2.  */
int[enter link description here][1]
STRCMP (const char *p1, const char *p2)
{
  const unsigned char *s1 = (const unsigned char *) p1;
  const unsigned char *s2 = (const unsigned char *) p2;
  unsigned char c1, c2;
  do
    {
      c1 = (unsigned char) *s1  ;
      c2 = (unsigned char) *s2  ;
      if (c1 == '\0')
        return c1 - c2;
    }
  while (c1 == c2);
  return c1 - c2;
}

https://code.woboq.org/userspace/glibc/string/strcmp.c.html

CodePudding user response:

int count_sentences(string text)
{
    int count = 0;
    for (int i = 0; i < text.size();   i) {
        if (text[i] == '?' || text[i] == '!' || text[i] == '.')
              count;
    }

    return count;
}

int main()
{
    string sentence = "abc. def? ghi!";
    cout << count_sentences(sentence) << endl;
}
  • Related