我是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函数来反转数组效率要高得多,但我感兴趣的是为什么上面的代码不起作用。
答案 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)
这里有两个问题:
sizeof
运算符不会为您提供字符串的长度。相反,它会为您提供正在使用的计算机上char*
的大小。您可以使用strlen()
来获取
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;
}