1

作为家庭作业的一部分,我需要能够获取输入字符串并使用字符串函数列表以多种方式对其进行操作。第一个函数接受一个字符串并使用 for 循环将其反转。这就是我所拥有的:

#include <iostream>
#include <string>

namespace hw06
{
    typedef std::string::size_type size_type;

    //reverse function
    std::string reverse( const std::string str );

}


// Program execution begins here.

int main()
{
    std::string inputStr;

    std::cout << "Enter a string: ";
    std::getline( std::cin, inputStr );


    std::cout << "Reversed: " << hw06::reverse( inputStr )
    << std::endl;


    return 0;
}


//reverse function definition

std::string hw06::reverse( const std::string str )
{

    std::string reverseStr = "";
//i starts as the last digit in the input. It outputs its current 
//character to the return value "tempStr", then goes down the line
//adding whatever character it finds until it reaches position 0
    for( size_type i = (str.size() - 1); (i >= 0); --i ){
        reverseStr += str.at( i );
    }
        return reverseStr;
}

程序要求输入,然后返回此错误:

在抛出 'std::out_of_range' what(): basic_string::tat 的实例后调用终止

我真的不知道我在这里做错了什么。循环对我来说似乎是正确的,所以我误解了如何引用该函数?

4

6 回答 6

5

除非您真的编写一个循环,否则执行以下操作可能更容易:

std::string reverse(std::string const &input) { 
    return std::string(input.rbegin(), input.rend());
}
于 2013-04-04T00:01:38.523 回答
2

问题是您的循环永远不会终止。你有你的条件i >= 0,但 size_type 是无符号的,所以0 - 1 == 2^(sizeof(size_t) * 8) - 1,这肯定超出了你的字符串的范围。因此,您需要选择其他东西作为您的终止条件。一种选择是您可以使用i != std::string::npos,但感觉不对。你可能会更好地使用类似的东西:

for (size_type i = str.size(); i != 0; ) {
    reverseStr += str.at(--i);
}

编辑: 我做了一些检查i != std::string::npos。它应该定义明确并且可以。但是,这似乎仍然是错误的做法。

于 2013-04-03T23:54:42.907 回答
2

正如 Andreas Grapentin 所说,问题在于std::string::size()返回size_t标准要求为无符号类型的 a 。所以它会一直如此>= 0,当你击中0并减少它时,你会得到一个非常大的正数。

考虑这样的事情:

std::string hw06::reverse(const std::string &str)
{
    std::string reverseStr;

    for(size_t i = str.size(); i != 0; i--)
        reverseStr += str.at(i - 1);

    return reverseStr;
}
于 2013-04-03T23:57:39.373 回答
1

我不热衷于回答作业问题,但看到一些答案,我无法抗拒:

std::string hw06::reverse(const std::string &str)
{ return std::string(str.rbegin(), str.rend()); }

如果您不能就地完成,简单、干净且浪费最少。

于 2013-04-04T00:55:37.777 回答
0

正如其他答案所说,问题出在循环中。我建议使用以下“转到”运算符:)

for(size_t i = str.size(); i --> 0;)
{
}
于 2013-04-03T23:58:00.077 回答
0

使用 i-- 而不是 --i。或者你会在得到 char 和得到循环问题之前降低 i 值。

于 2013-06-10T10:04:39.513 回答