在C中反转数组

时间:2012-09-24 00:42:05

标签: c arrays string

我是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 个答案:

答案 0 :(得分: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}}。我假设你的函数将返回你的新字符串?

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

答案 1 :(得分: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;
}

请注意,由于implicit conversion(请参阅重载(5)),您还可以使用普通的C风格char指针调用此函数。

答案 2 :(得分:2)

这里有两个问题:

  1. sizeof运算符不会为您提供字符串的长度。相反,它会为您提供正在使用的计算机上char*的大小。您可以使用strlen()来获取

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

答案 3 :(得分: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;
}