0

我是 cpp 新手,对数组有疑问。我在下面的代码应该创建一个反向版本的 str 并将其存储在 newStr 中。但是, newStr 总是空的。有人可以向我解释为什么会发生这种情况,即使我从 str 中分配了一个值?

void reverse (char* str) {
    char* newStr = (char*)malloc(sizeof(str));

    for (int i=0;i<sizeof(str)/sizeof(char);i++) {
       int index = sizeof(str)/sizeof(char)-1-i;
       newStr [i] = str [index];
    }
}

PS:我知道通过移动指针或使用 std::reverse 函数来反转数组效率更高,但我对上述代码不起作用的原因很感兴趣。

4

4 回答 4

6

正如上面评论者指出的那样,sizeof(str)并没有告诉你字符串的长度。你应该使用size_t len = strlen(str);

void reverse (char* str) {
   size_t len = strlen(str);
   char* newStr = (char*)malloc(len + 1);

   for (int i=0; i<len;i++) {
      int index = len-1-i;
      newStr[i] = str[index];
   }
   newStr[len] = '\0'; // Add terminator to the new string.
}

不要忘记free你的任何记忆malloc。我假设您的函数将返回您的新字符串?

编辑:长度+1,为终结者腾出空间。

于 2012-09-24T00:52:20.357 回答
3

sizeof 运算符(它不是函数!)在编译时进行评估。您正在向它传递一个指向您声称拥有字符串的内存区域的指针。但是,此字符串的长度在编译时并不固定。sizeof(str)/sizeof(char)将始终产生架构上指针的大小,可能是 8 或 4。

你想要的是用来strlen确定你的字符串的长度。

或者,一种更惯用的方法是使用std::string(如果您坚持自己反转字符串)

std::string reverse(std::string str) {
  for (std::string::size_type i = 0, j = str.size(); i+1 < j--; ++i) {
    char const swap = str[i];
    str[i] = str[j];
    str[j] = swap;
  }
  return str;
}

请注意,由于隐式转换(请参阅重载(5)),您还可以使用纯 C 样式char指针调用此函数。

于 2012-09-24T00:48:53.093 回答
2

这里有两个问题:

  1. sizeof操作员不会给你字符串的长度。相反,它为您提供了char*您正在使用的机器上的 a 大小。您可以strlen()改为使用

  2. c-string 以 NULL 字符终止(这就是为什么strlen()可以返回正确长度的字符串)。您需要确保不会意外地将 NULL 字符从源字符串复制到目标字符串的开头。此外,您需要在目标字符串的末尾添加一个 NULL 字符,否则您会得到一些意外的输出。

于 2012-09-24T00:57:47.240 回答
0
#include <bits/stdc++.h>

using namespace std;

vector<string> split_string(string);

// Complete the reverseArray function below.
vector<int> reverseArray(vector<int> a) {
    return {a.rbegin(), a.rend()};

}

int main()
{
    ofstream fout(getenv("OUTPUT_PATH"));

    int arr_count;
    cin >> arr_count;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    string arr_temp_temp;
    getline(cin, arr_temp_temp);

    vector<string> arr_temp = split_string(arr_temp_temp);

    vector<int> arr(arr_count);

    for (int i = 0; i < arr_count; i++) {
        int arr_item = stoi(arr_temp[i]);

        arr[i] = arr_item;
    }

    vector<int> res = reverseArray(arr);

    for (int i = 0; i < res.size(); i++) {
        fout << res[i];

        if (i != res.size() - 1) {
            fout << " ";
        }
    }

    fout << "\n";

    fout.close();

    return 0;
}

vector<string> split_string(string input_string) {
    string::iterator new_end = unique(input_string.begin(), input_string.end(), [] (const char &x, const char &y) {
        return x == y and x == ' ';
    });

    input_string.erase(new_end, input_string.end());

    while (input_string[input_string.length() - 1] == ' ') {
        input_string.pop_back();
    }

    vector<string> splits;
    char delimiter = ' ';

    size_t i = 0;
    size_t pos = input_string.find(delimiter);

    while (pos != string::npos) {
        splits.push_back(input_string.substr(i, pos - i));

        i = pos + 1;
        pos = input_string.find(delimiter, i);
    }

    splits.push_back(input_string.substr(i, min(pos, input_string.length()) - i + 1));

    return splits;
}
于 2020-02-03T09:41:04.247 回答