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

C++ - Attempting to use string functions to reverse an input string

本文关键字:字符串 输入 函数      更新时间:2023-10-16

作为家庭作业的一部分,我需要能够接受一个输入字符串,并使用字符串函数列表以几种方式操作它。第一个函数接受一个字符串,并使用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实例后调用终止(什么):basic_string::乙

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

除非你真的想让写一个循环,否则这样做可能更容易:

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

问题是循环永远不会终止。你的条件是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。它应该是定义明确的。然而,这似乎仍然是错误的做法。

正如Andreas Grapentin所说,问题在于std::string::size()返回的size_t是标准要求的unsigned类型。所以总是>= 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;
}

我不太喜欢回答作业问题,但看到一些答案,我忍不住:

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

简单,干净,最不浪费的如果你不能在原地做。

正如其他答案所说,问题出在循环中。我建议使用以下"goes to"操作符:)

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

使用i——而不是——i。或者u将在获取char之前减小i的值,从而导致循环问题。