Использование указателей для передачи аргументов C-String

Я застрял на этой программе весь день. Наконец-то я чувствую, что подхожу очень близко. Я должен найти количество гласных и символов в строке. Затем выведите их в конце. Однако при компиляции моя программа вылетает. Я проверил синтаксис и смотрел в своей книге весь день. Если кто-то может помочь, я был бы очень признателен! потому что у меня есть еще 5 похожих функций для написания, которые манипулируют c-строками. Спасибо!

#include <iostream>
#include <string>
using namespace std;

int specialCounter(char *, int &);int main()
{

const int SIZE = 51;        //Array size
char userString[SIZE];      // To hold the string
char letter;
int numCons;// Get the user's input string
cout << "First, Please enter a string (up to 50 characters): " << endl;
cin.getline(userString, SIZE);
// Display output
cout << "The number of vowels found is " << specialCounter(userString, numCons) <<      "." << endl;
cout << "The number of consonants found is " << numCons << "." << endl;}int specialCounter(char *strPtr, int &cons)
{
int vowels = 0;
cons = 0;while (*strPtr != '/0')
{
if (*strPtr == 'a' || 'A' || 'e' || 'E' || 'i' || 'I' || 'o' || 'O' || 'u' || 'U')
{
vowels++;       // if vowel is found, increment vowel counter
// go to the next character in the string
}
else
{
cons++;         // if consonant is found, increment consonant counter
// go to the next character in the string
}

strPtr++;

}
return vowels;

}

0

Решение

Я собираюсь предположить, что вы ограничены не использовать std::string или же std::getline и что вы должны предположить, что пользователь вводит что-то менее 51 символа.

Ваша авария проистекает из:

while (*strPtr != '/0')

Нулевой символ — это escape-код. '/0' является литералом, состоящим из нескольких символов, со значением, определяемым реализацией. Это означает, что это, вероятно, всегда правда. Измените это на:

while (*strPtr != '\0') //or while (strPtr)

Кроме того, у вас есть логическая ошибка с проверкой гласных. Вы должны проверить это против каждой гласной, как это:

if (*strPtr == 'a' || *strPtr == 'e') //etc.

Вам будет легче, если вы сравните с toupper или же tolower Версия каждого символа для уменьшения количества сравнений в 2 раза.

3

Другие решения

while (*strPtr != '/0')

Должно быть:

while (*strPtr != 0)

или же

while (*strPtr != '\0');

Разве ваш компилятор не дал вам предупреждение? Если это так, не игнорируйте предупреждения. Если нет, найдите лучший компилятор.

Смотрите также комментарии об ошибке в вашем другом сравнении.

2

Другие ответы должны решить вашу проблему. Могу ли я предложить вам написать отдельные функции вместо одной всемогущей?

bool IsSpecialChar(char c)
{
switch(c)
{
case 'a':
case 'A':
case 'e':
case 'E':
case 'i':
case 'I':
case 'o':
case 'O':
case 'u':
case 'U':
return true;
}
return false;
}int specialCounter(char *strPtr, int &cons)
{
int vowels = 0;
cons = 0;
while (*strPtr != '\0')
{
IsSpecialChar(*strPtr) ? vowels++ : cons++;
strPtr++;

}
return vowels;
}
2