我编写了以下代码来反转字符串而不使用<algorithm> reverse
。我写道:
#include <string.h>
#include <iostream>
using namespace std;
void reverse(char *str){
int sizeStr=strlen(str);
int firstChar,lastChar,temp;
for(lastChar = (sizeStr - 1),firstChar = 0 ; lastChar>firstChar ; lastChar--, firstChar++){
temp = str[firstChar];
str[firstChar]=str[lastChar];
str[lastChar] = temp;
}
}
int main() {
char *str;
str = "myname";
reverse(str);
cout << str << endl;
return 0;
}
我在str[firstChar]=str[lastChar];
遇到了段错误。请帮我弄清楚我的错误。
注意:我宣布char str[] = "myname"
并且工作得很好。但根据您的所有解释,我们必须了解*str
和str[]
的差异。非常感谢。在帮助新程序员方面做了很长的工作。
答案 0 :(得分:5)
您无法修改常量字符串文字。
使用std::string
(感谢@chris)。使用std::swap
来交换字符。 (见C++ string swap character places)
答案 1 :(得分:1)
使用std :: string,您可以使用以下方法来反转字符串
string reverse_string(string arg){
int length = arg.length();
char res[length];
for(int i = length - 1; i >= 0; i--){
res[length - (i+1)] = arg[i];
}
string result(res);
return result;
}
如果您有任何其他问题,请与我们联系。
答案 2 :(得分:0)
str的内容是常量,你应该使用char指针。
答案 3 :(得分:0)
原因是你没有将内存分配给字符指针str。
#include <string.h>
#include <iostream>
using namespace std;
void reverse(char *str){
int sizeStr=strlen(str);
int firstChar,lastChar,temp;
for(lastChar = (sizeStr - 1),firstChar = 0 ; lastChar>firstChar ; lastChar--, firstChar++){
temp = str[firstChar];
str[firstChar]=str[lastChar];
str[lastChar] = temp;
}
}
int main() {
char *str;
// Here use malloc to allocate memory to the character pointer str
// Or instead of using a char pointer use a character array to initialize the string
// char *str = malloc(strlen("myname") + 1) or usr char str[10] = "myname"
str = "myname";
reverse(str);
cout << str << endl;
return 0;
}
答案 4 :(得分:0)
#include <string.h>
#include <iostream>
using namespace std;
void reverse(char *str){
int sizeStr=strlen(str);
int firstChar,lastChar,temp;
for(lastChar = (sizeStr - 1),firstChar = 0 ; lastChar>firstChar ; lastChar--, firstChar++){
temp = str[firstChar];
str[firstChar]=str[lastChar];
str[lastChar] = temp;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char *str;
str = "myname";
char *str2 = new char [strlen(str)+1];
strcpy(str2,str);
reverse(str2);
cout << str2 << endl;
delete [] str2;
str2 = NULL;
cout << str << endl;
return 0;
}
答案 5 :(得分:0)
我认为你可能会以艰难的方式解决这个问题。如果使用std :: string,问题会变得容易多了。下面是一个更通用的C ++ 1y解决方案,它将能够反转许多不同类型的容器。容器必须覆盖[]运算符。
#include <iostream>
template <typename T>
auto rev(T &&a){
for (auto i = 0; i < a.size()/2; ++i){
std::swap(a[i], a[a.size()-1-i]);
}
return a;
}
int main(){
std::string x = "hello";
std::cout<< rev(x);
}
答案 6 :(得分:0)
#include <string.h>
#include <iostream>
void myreverse(std::string &s) {
size_t begin = 0, end = s.length();
while ((begin != end) && (begin != --end))
std::swap(s[begin++], s[end]);
}
int main() {
const char *str = "myname";
std::cout << str << std::endl;
std::string newstr(str);
myreverse(newstr);
std::cout << newstr << std::endl;
return 0;
}