【发布时间】:2015-07-09 16:34:18
【问题描述】:
我正在编写一个程序,它应该接受一个字符串,从字符串中删除所有空格和标点符号,然后将所有字符转换为大写并将它们增加 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]++;
}
}
}
【问题讨论】:
-
请注意
length更改不会在您的函数之间传播。看看 call-by-reference 和 call-by-value 的区别。 -
为什么要按值传递
string? -
@GenCrash10 语句“...将它们增加 13 个空格”是什么意思?
-
如果您的函数实际上是函数,这会容易得多 - 即它们返回一个新字符串 - 并且您在继续下一步之前完成了一个步骤。在每个转换函数中使用循环,不要传递
i和length。 -
@VladfromMoscow 我相信它的意思是“实施 ROT-13”。
标签: c++ function encryption converter freeze