我编写了一个C ++函数,可以表示如下: 它只需要一个字符串(这是崩溃的地方)并将其反转。
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
cout<<"Enter a string: "<<endl;
char *str;
gets(str);
cout<<"Reversed String is: ";
for(int i=strlen(str)-1;i>=0;i--)
cout<<(str[i]);
return 0;
}
我猜有某种内存访问违规行为。
任何线索为什么这不起作用?
错误:分段错误(核心转储)
答案 0 :(得分:2)
在c++中,通过std::reverse
中的algorithm
,可以更轻松,更不容易出错解决此问题。它也更容易使用std::string
。
#include <iostream>
#include <algorithm>
int main ()
{
std::string input;
std::cout << "Enter string to reverse: ";
std::cin >> input;
std::reverse(input.begin(),input.end());
std::cout << "Reversed string: " << input << std::endl;
return 0;
}
如果你必须通过char数组来做,试试这个(你甚至不需要动态内存分配)
#include <iostream>
#include <algorithm>
#include <cstring>
int main ()
{
char input[1024];
puts("Enter string to reverse: ");
fgets(input, 1024, stdin);
std::reverse(input, input + strlen(input));
printf("Reversed string: %s", input);
return 0;
}
答案 1 :(得分:2)
您的代码不是c ++风格,我建议您查看Filip(https://stackoverflow.com/a/45903067/4386427)的答案
我只会解决你的代码出了什么问题。
当你这样做时
char* str;
你得到的只是一个可以指向char
的指针。持有char
没有任何记忆。此外,指针变量str
的值未初始化。
所以当你这样做时
strlen(str)
您读取了未初始化的变量,并尝试将此未初始化的值视为C样式字符串。这是未定义的行为,很可能导致程序崩溃。
在使用之前,您需要确保str
已初始化。你想要动态内存,你可以这样做:
char *str;
str = new(char[100]); // Initialize str to point to a dynamic allocated
// char array with size 100
...
...
delete(str);
但是再次 - 我不会在c ++代码中使用这种风格