Я пишу программу, которая должна взять строку, удалить все пробелы и знаки препинания из строки, затем преобразовать все символы в верхний регистр и увеличить их на 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]++;
}
}
}
Я думаю, это плохая идея, чтобы отправить счетчик 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);