【问题标题】:C++ string returning as "C++ 字符串返回为 "
【发布时间】:2021-12-27 23:29:27
【问题描述】:

我正在尝试编写一个反转字符串的函数。我已经弄清楚了大部分代码,当我将字符串打印到std::cout 时,它显示了我需要的内容。但是,当我测试代码时,结果是我从函数中得到了"。这是我的代码:

#include <iostream>
#include <string>
using namespace std; 
string result;
string reverseString (string str)
{
  for(int i = str.length(); i >= -1; i--) {
    result+= str[i];
  }
  cout << result;
  return result;
}

【问题讨论】:

  • 这本身不是一个可运行的程序。请展示一个完整的示例。除非我们了解您如何使用它,否则我们无法告诉您代码有什么问题。
  • 也就是说:你了解局部变量和全局变量的区别吗? result 是哪一种?为什么选择这种方式?
  • @KarlKnechtel 虽然我还没有深入研究 C++ 的范围。我很清楚全局变量和局部变量的区别(至少在 C# 中)。我选择将结果设为全局变量,因为我尝试使用局部变量但它不起作用。另外,这实际上是关于代码战的问题,我可以在他们展示的测试中添加。
  • string reverseString (string const&amp; str) { return string(str.rbegin(), str.rend()); }
  • 或者,您可以简单地取消这个手动功能,而使用标准的std::reverse()算法,例如:string str = ...; std::reserve(str.begin(), str.end());

标签: c++ string reverse function-definition


【解决方案1】:

在这个 for 循环中,在第一次迭代中:

  for(int i = str.length(); i >= -1; i--) {
    result+= str[i];
  }

终止零字符'\0' 被写入对象result 的第一个位置,因为在这种情况下表达式str[i] 等效于表达式str[str.length()]

因此,result 字符串作为空字符串输出。

此外,您正尝试使用负索引 -1 访问源字符串,这会导致未定义的行为。

除了这个for循环,你可以写:

result.assign( str.rbegin(), str.rend() );

如果您想使用for 循环来完成任务,那么循环可以如下所示:

result.clear();
result.reserve( str.length() ); 

for ( auto i = str.length(); i != 0; ) {
    result += str[--i];
}

注意,在函数中使用全局变量result 是个坏主意。该函数可能如下所示:

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

【讨论】:

    猜你喜欢
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2017-02-23
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多