【问题标题】:Why does my c++ program appear to hang为什么我的 c++ 程序似乎挂起
【发布时间】: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 个空格”是什么意思?
  • 如果您的函数实际上是函数,这会容易得多 - 即它们返回一个新字符串 - 并且您在继续下一步之前完成了一个步骤。在每个转换函数中使用循环,不要传递ilength
  • @VladfromMoscow 我相信它的意思是“实施 ROT-13”。

标签: c++ function encryption converter freeze


【解决方案1】:

我认为,在没有初始化的情况下将计数器i 发送到文本转换函数是个坏主意。

所以,第一个建议:在main函数中初始化i,或者重写代码以便在convertRemovePunc等中不发送i

第二个建议是关于将字符串发送到文本转换函数:像void convert(string text, int&amp; 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多