Millet123
Millet123

Reputation: 33

Consonant counting program not returning number of consonants

This program is supposed to compare the list of consonants to a user input list of letters and print out the number of consonants in the user's input. However, it just prints 0. I'm very new to C++ and am not experienced in finding logic errors.

#include <iostream>
#include <cctype>
#include <string>
using namespace std;
int counter(char *, char);
int main()
{
  const int size = 51;
  char input[size];
  const char consonants[22] = "bcdfghjklmnpqrstvwxyz";
  cout << "Enter your letters." << endl;
  cin >> input;
  cout << consonants << "appears";
  cout << counter(input, consonants[22]) << "times" << endl;
}

int counter(char *strPtr, char ch)
{
  int times = 0;

  while (*strPtr != '\0')
  {
    if (*strPtr == ch)
        times++;
    strPtr++;
  }

  return times;
}

Upvotes: 1

Views: 376

Answers (3)

Raydel Miranda
Raydel Miranda

Reputation: 14360

I'm aware you're new to C++, and this looks like some kind of exercise you are doing in order to learn, but I will post this answer so you can see how get this done using some of the C++ standar functions.

Using find function from algorithm

string test = "Hello world";
string vowels("aeiuo");     // Its much easier to define vowels than consonants.
int consonants_count = test.length();  // Assume all letters are consonants.

for (auto &c : test)  // for each character in test
{
    if (find(vowels.begin(), vowels.end(), c) != vowels.end()) // If c is founded inside vowels ...
    {
        consonants_count--; // Decrement the number of consonants.
    }

}

Using regular expressions

#include <regex>

string test = "Hello world";                 // A test string.
regex re("a|e|i|o|u");                       // Regular expression that match any vowel.
string result = regex_replace(test, re, ""); // "Delete" vowels.
cout << result.length() << endl;             // Count remaining letters.

Upvotes: 1

No Idea For Name
No Idea For Name

Reputation: 11597

your function counter if checking the input char by char and compare it to a single char(ch).

you need to run your counter function on all the chars in consonants array, or change the counter function:

int count = 0

for(int i = 0; i < 22 ; i ++)
{
   count += counter(input, consonants[i])
}

now an even better way will be to count the non consonants characters and then do length-count

#include <iostream>
#include <cctype>
#include <string>
using namespace std;
int counter(char *, char);
int main()
{
  const int size = 51;
  char input[size];

  cout << "Enter your letters." << endl;
  cin >> input;
  cout << consonants << "appears";
  cout << counter(input) << "times" << endl;
}

int counter(char *strPtr)
{
  int times = 0;
  int length = 0;
  const char consonants[5] = "aeoui";
  while (*strPtr != '\0')
  {
    for(int i = 0; i < 5 ; i ++)
    {
        if (*strPtr == consonants[i])
            times++;
        strPtr++;
        length++;
    }
  }

  return length-times;
}

Upvotes: 0

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726809

Three problems:

  • You are not passing an array of consonants, you are passing a single character
  • You are passing an invalid character (one past the end of the consonant array)
  • You are counting how many times that invalid character is present.

To fix this problem, make sure that you pass an array as the second parameter, and add a nested loop to iterate that array.

Upvotes: 1

Related Questions