isalpha, вызывающая «Ошибка отладочного подтверждения» в переполнении стека

У меня есть короткая программа, предназначенная для подсчета количества согласных в строке путем первого тестирования, чтобы увидеть, является ли символ в массиве альфа-символом (чтобы пропустить любой пробел или пунктуацию). Я продолжаю получать Отладочное Утверждение Не удалось для моей строки кода if (isalpha (strChar)).

«strChar» — это переменная, которой присваивается значение char в цикле for

Извините, если это исправительная проблема, но я не уверен, где я иду не так. Заранее благодарю за любую помощь!

#include <iostream>
#include <cctype>
using namespace std;
int ConsCount(char *string, const int size);int main()
{
const int SIZE = 81; //Size of array
char iString[SIZE]; //variable to store the user inputted string

cout << "Please enter a string of no more than " << SIZE - 1 << " characters:" << endl;
cin.getline(iString, SIZE);

cout << "The total number of consonants is " << ConsCount(iString, SIZE) << endl;
}

int ConsCount(char *string, const int size)
{
int count;
int totalCons = 0;
char strChar;

for (count = 0; count < size; count++)
{
strChar = string[count];
if (isalpha(strChar))
if (toupper(strChar) != 'A' || toupper(strChar) != 'E' || toupper(strChar) != 'I' || toupper(strChar) != 'O' || toupper(strChar) != 'U')
totalCons++;
}
return totalCons;
}

1

Решение

Функция ConsCount(char* string, const int size) должно быть так:

int ConsCount(char *string, const int size)
{
int consCount = 0;

char* begin = string;
for (char* itr = begin; *itr != '\0'; ++itr)
{
if (isalpha(*itr)) {
char ch = toupper(*itr);

switch(ch) {
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
break; // If ch is any of 'A', 'E', 'I', 'O', 'U'
default:
++consCount;
}
}
}

return consCount;
}

Как видите, я заменил оператор if переключателем для лучшей читаемости и использования char* в качестве итератора для перебора строки. Вы можете удалить неиспользуемый параметр int size в вашем коде.

А также я предлагаю вам использовать std::string для безопасного кода. Он также предоставляет вам iterator класс для перебора std::string,

0

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

Я предполагаю, что проблема в том, что вы всегда просматриваете 81 символ, хотя вводите меньше. Это приводит к некоторым случайным данным, которые isalpha(),

Во всяком случае, я бы изменить на код для использования std::string вместо char iString[SIZE] чтобы получить фактическую длину введенного текста.

1

int ConsCount(char *string, const int size)
{
int consCount = 0;

char* begin = string;
for (char* itr = begin; *itr != '\0'; ++itr)
{
if (isalpha(*itr)) {
char ch = toupper(*itr);

switch(ch) {
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
break; // If ch is any of 'A', 'E', 'I', 'O', 'U'
default:
++consCount;
}
}
}

return consCount;

попробуй это

}

-1
По вопросам рекламы [email protected]