尝试使用字符串函数来反转输入字符串
C++ - Attempting to use string functions to reverse an input string
作为家庭作业的一部分,我需要能够接受一个输入字符串,并使用字符串函数列表以几种方式操作它。第一个函数接受一个字符串,并使用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的值,从而导致循环问题。
相关文章:
- 如何使用堆栈将字符串输入拉伸 k 次
- 不确定出了什么问题(字符串输入)
- 如何获取字符串输入n次?
- 使用重定向命令从 stdin 读入的字符串"<"输入文件未正确附加
- isPalindrome不显示输出,isPalindrome函数未使用字符串输入作为字符串参数进行测试
- C++ 对象数组字符串输入在控制台上不起作用
- 为什么 cin 在包含字符串标头后接受字符串输入
- 拆分字符串输入并查找字符是否有效
- 有没有办法将最初作为字符串输入的数字字符数组复制到双向链表中
- 将字符串输入到多维数组中
- 字符串输入后的空格
- 字符串流中的自定义字符串输入
- C 未验证字符串输入
- 总结数字字符串输入的最佳方法
- 如何验证用户将字符串输入到std :: cin中
- 在C++测试家庭作业问题中的字符串输入时无法退出循环(作为数据验证)
- 如何在C++中检测字符串输入中的换行符
- C++将字符串输入拆分为两个整数
- 如何检查字符串输入是否为有效的双精度
- 在读取数据文件时,如何找到用户字符串输入的字谜?