【问题标题】:Runtime Error Caused by C++ String ProgramC++字符串程序导致的运行时错误
【发布时间】:2016-05-09 09:32:43
【问题描述】:

我正在用 C++ 创建这个程序,它要求用户输入带有大写和小写字母的电影标题。它确定并显示标题中大小写字母的数量。然后它创建 3 个字符串,将原始字符中的所有字符转换为大写,然后转换为小写,然后转换为相反的大小写。它分别显示这些字符串。在显示大小写字母的数量后出现问题。程序输出一条错误消息,说明它必须请求运行时以不寻常的方式终止它。我需要一些帮助来识别问题并解决它。谢谢 这是我的代码:

#include <cstdlib>
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main(int argc, char *argv[])
{
    string title, upper, lower, swap;
    int upCount = 0, lowCount = 0;

    cout << "Please enter your favorite movie title:\n(it should have upper and lowercase letters)" << endl;
    getline(cin, title);
    for (int i = 0; i < title.size(); i++)
    {
        if (isupper(title.at(i)))
            upCount++;
        else if (isalpha(title.at(i)))
            lowCount++;
    }
    cout << title << " has " << upCount << " uppercase letters and " << lowCount << " lowercase letters." << endl;
    for (int i = 0; i < title.size(); i++)  
    {    
         upper.at(i) = title.at(i);
         lower.at(i) = title.at(i);
         swap.at(i) = title.at(i);
    }
    for (int i = 0; i < title.size(); i++)
    {
         if (isupper(title.at(i)))
             swap.at(i) = tolower(int(swap.at(i)));
         else
             swap.at(i) = toupper(int(swap.at(i)));
         upper.at(i) = toupper(int(upper.at(i))); 
         lower.at(i) = tolower(int(lower.at(i)));
    }
    cout << upper << endl
         << lower << endl
         << swap << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

【问题讨论】:

  • 你做了什么来调试你的代码?它在哪一行失败?
  • @jmarkmurphy 它似乎在第二个 for 循环之后的任何地方都失败了。我不知道有什么方法可以像通常那样调试它,因为它在运行时会崩溃。
  • 您可以使用源调试器吗?如果没有,您可以将简单的消息输出到日志文件或控制台,例如“我到了”,甚至可能是该位置的一些重要变量值。这可能需要几次迭代,但您可以缩小故障位置。
  • 对不起,我不知道源调试器是什么。但是,通过使用 cout 语句,我能够确定程序在进入第二个 for 循环时立即失败。

标签: c++ string runtime dev-c++


【解决方案1】:

您永远不会将upperlowerswap 初始化为任何值。当您执行upper.at(i)lower.at(i)swap.at(i) 时,程序将中断。

您可以通过在第二个循环之前将upperlowerswap 全部设置为title 来解决此问题。

变化:

...
    cout << title << " has " << upCount << " uppercase letters and " << lowCount << " lowercase letters." << endl;
    upper = lower = swap = title; //Add this
    for (int i = 0; i < title.size(); i++)
...

输出:

Please enter your favorite movie title:
(it should have upper and lowercase letters)
V for Vendetta
V for Vendetta has 2 uppercase letters and 10 lowercase letters.
V FOR VENDETTA
v for vendetta
v FOR vENDETTA

【讨论】:

  • 对不起,如果我现在真的很愚蠢,但我不完全理解你指出的错误。我不认为它超出了界限,因为标题的长度总是比它的最后一个索引大一,并且 upper、lowerswap 设置为 title。然后我将它们设置为自己的大写、小写或相反版本。
  • @CZou48 你说得对。我读错了陈述。但是,在第二个循环中,upperlowerswap 都未初始化,这意味着您还不能使用 .at() 设置任何内容。
  • 你能告诉我如何解决这个问题吗?如何在不知道用户将为title 输入什么的情况下初始化这些字符串。
  • 我已将其添加到我的答案中。
  • 哦,抱歉,我刚刚意识到我可以在不设置每个字母的情况下将字符串相互设置
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 2014-07-26
  • 1970-01-01
相关资源
最近更新 更多