2016-02-01 57 views
1

我使用C++创建了该程序,该程序要求用户使用大小写字母输入电影标题。它确定并显示标题中的大写和小写字母的数量。然后它创建3个字符串,将原件中的所有字符都转换为大写,然后转换为小写,然后转换为相反的情况。它分开显示这些字符串。显示大写和小写字母的数量后出现问题。该程序输出一条错误消息,指出它必须请求运行时以不寻常的方式终止它。我需要一些帮助来确定问题并修复它。由于 这里是我的代码:由C++字符串程序导致的运行时错误

#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; 
} 
+0

你做了什么调试代码?它失败了什么? – jmarkmurphy

+0

@jmarkmurphy它似乎在第二个循环之后的任何地方都失败了。我不知道任何方式来调试,就像我通常会因为它在运行时崩溃。 – CZou48

+0

你有权访问源代码调试器吗?如果不是的话,你可以输出简单的消息到日志文件或控制台,比如“我到了这里”,甚至可能为该位置提供一些重要的变量值。这可能需要几次迭代,但是您可以缩小故障位置。 – jmarkmurphy

回答

2

你永远不会初始化upperlower,或swap为任意值。当你做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 
+0

对不起,如果我现在真的很愚蠢,但我不完全了解你指出的错误。我认为它不会超出范围,因为标题的长度总是比最后一个索引多一个,<运算符可以防止它比最后一个索引更远。在第二个for循环中,我将'upper','lower'和'swap'设置为'title'。然后我将它们设置为大写,小写或相反版本。 – CZou48

+0

@ CZou48你说得越界越好。我读了错误的陈述。但是,从第二个循环开始,'upper','lower'和'swap'都是未初始化的,这意味着你不能使用'.at()'来设置任何东西。 –

+0

你能告诉我如何解决这个问题吗?如何在不知道用户将为“title”输入的情况下初始化这些字符串。 – CZou48

相关问题