function — Почему моя программа на С ++ зависает

Я пишу программу, которая должна взять строку, удалить все пробелы и знаки препинания из строки, затем преобразовать все символы в верхний регистр и увеличить их на 13 пробелов. Профессор, который ожидает от меня этого, требует, чтобы я использовал функции для обработки программы. Я написал его, следуя этим параметрам, но по какой-то причине после ввода предложения, такого как «Это строка!», Программа, кажется, просто зависает. Если я запускаю отладчик шаг за шагом, то программа, кажется, работает нормально. Я не уверен, где я иду не так, и профессор запрещает нам обращаться за помощью к одноклассникам. Поскольку он ничего не сказал о поиске помощи в Интернете, я подумал, что зайду сюда после поиска этого сайта.

Моя программа:

#include <iostream>
#include <string>

using namespace std;

void convert(string text, int& i,int length);
void RemovePunc(string text, int& i,int length);
void RemoveSpac(string text, int& i,int length);
void MakeUpper(string text, int i,int length);

int main()
{
string text;
int i;
int length;cout << "Enter your text: ";
getline(cin, text);

length = (int)text.length();

convert(text, i, length);

return 0;
}

void convert(string text, int& i,int length)
{
for(i = 0; i < length; i++)
{
RemovePunc(text, i, length);
RemoveSpac(text, i, length);
MakeUpper(text, i, length);

}
cout << "Encrypted text:\n" << text << endl;
}

void RemovePunc(string text, int& i,int length)
{
if (ispunct(text[i]))
{
text.erase(i--, 1);
length = text.size();
}
}

void RemoveSpac(string text, int& i,int length)
{
if (isspace(text[i]))
{
text.erase(i--, 1);
length = text.size();
}
}

void MakeUpper(string text, int i,int length)
{
if (isalpha(text[i]))
{
text[i] = toupper(text[i]);

for (int counter = 0; counter < 13; counter++)
{
if (text[i] == 'Z')
text[i] = 'A';
else
text[i]++;

}
}
}

-3

Решение

Я думаю, это плохая идея, чтобы отправить счетчик i в функции преобразования текста без инициализации.

Итак, первое предложение: инициализировать i в main функция или переписать код, чтобы не отправлять i в convert, RemovePunc, так далее.

Второе предложение касается отправки строки в функции преобразования текста: такие функции, как void convert(string text, int& i,int length); сделайте копию текста для работы с данными внутри и не изменяйте данные снаружи. Ваши функции должны измениться text, так что лучше использовать указатель на строку или ссылку, например:

 void convert(string &text, int& i,int length);
void RemovePunc(string &text, int& i,int length);
void RemoveSpac(string &text, int& i,int length);
void MakeUpper(string &text, int i,int length);
0

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


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