【问题标题】:Reverse string with pointers and functions in C++在 C++ 中使用指针和函数反转字符串
【发布时间】:2020-02-20 10:53:59
【问题描述】:

我正在尝试使用 C++ 中的指针和函数创建一个反转字符串的程序,但到目前为止,我的方法只返回一个空字符串而不是反转的字符串。

#include <iostream>

using namespace std;

void invertS(string *str_ptr );

int main()
{
   string value {"Hello"};
   string *str_ptr {nullptr};
   str_ptr = &value;
   invertS(str_ptr);
   cout << value;
};

void invertS(string *str_ptr) {
    string str = *str_ptr;
    string temp = "";
    int length = str.length();
    int j = length - 1;
    for (int i = 0; i < length; i++) {
        temp[i] = str[j];
        j--;
    };
    *str_ptr = temp;
};

结果总是一个空字符串。 请注意,我将 str_ptr 引用的字符串分配给函数内的新字符串,以便我可以在字符串上使用 .length。据我所知,由于 .length 不能用于指针。如果有更好的方法可以做到这一点,我也很高兴知道它是怎么回事。

【问题讨论】:

标签: c++ function pointers reference


【解决方案1】:

问题是您正在初始化零长度的临时字符串,然后尝试访问索引(这应该会使 IMO 失败)。简单的解决方法是创建原始字符串的副本,以便长度与要反转的原始字符串相同。

// Example program
#include <iostream>

using namespace std;

void invertS(string *str_ptr );

int main()
{
   string value {"Hello"};
   string *str_ptr {nullptr};
   str_ptr = &value;
   invertS(str_ptr);
   cout << "Reversed string: " << value << endl;
};

void invertS(string *str_ptr) {
    string str = *str_ptr;
    string temp {str};
    int length = str.length();

    int j = length - 1;
    for (int i = 0; i < length; i++) {
        temp[i] = str[j];
        j--;
    };
    *str_ptr = temp;
};

【讨论】:

  • "IMO 应该失败" 当涉及 UB 时,没有人能说“应该”发生什么。它绝对可以做任何事情。
  • 是的,你是对的,我刚刚检查过它有“未定义的行为”
【解决方案2】:

我认为这只是为了教育/学习,但是当我们拥有如此丰富的 C++ 库时,您应该避免使用指针。

要修复上述代码,您需要将字符附加到temp。大小 temp 的大小为零。或者用length调整它的大小

temp += str[j];

【讨论】:

    【解决方案3】:

    你在这里创建一个长度为0的新字符串:

    string temp = "";
    

    然后你会这样做:

    temp[i] = str[j];
    

    但是,这个字符串的大小仍然是0,所以这是不正确的。制作后您必须调整字符串的大小:

    temp.resize(str.length());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 2012-05-05
      相关资源
      最近更新 更多