C ++ - 尝试使用字符串函数来反转输入字符串

时间:2013-04-03 23:46:34

标签: c++ string namespaces reverse

作为家庭作业的一部分,我需要能够使用输入字符串并使用字符串函数列表以多种方式操作它。第一个函数接受一个字符串并使用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

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

6 个答案:

答案 0 :(得分:5)

除非你真的希望写一个循环,否则可能更容易做类似的事情:

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

答案 1 :(得分: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进行了一些检查。它应该是明确定义的。但是,它似乎仍然是错误的做法。

答案 2 :(得分:2)

正如Andreas Grapentin所说,问题是std::string::size()返回size_t,标准要求该>= 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; } 并递减它时,你会得到一些非常大的正数。

考虑这样的事情:

{{1}}

答案 3 :(得分:1)

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

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

如果你不能就地做到这一点,那么简单,干净,最少浪费。

答案 4 :(得分:0)

正如其他答案所说,问题出在循环中。我建议使用以下&#34;转到&#34;运营商:)

for(size_t i = str.size(); i --> 0;)
{
}

答案 5 :(得分:0)

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