C++ 如何使用C反转字符串?

C++ 如何使用C反转字符串?,c++,visual-studio-2008,C++,Visual Studio 2008,我试图在VisualStudio2008中运行以下代码。但是在运行时程序抛出了一个错误 reverseString.exe中0x002e1480处未处理的异常:0xC0000005: 访问冲突写入位置0x002e573c void反向(char*str) { char*end=str; char-tmp; 如果(str) { while(*结束) { ++结束; } --结束; while(str StrLon < /Cord>?我在“ STD::CARYMARGIONS >下,我完全没有经验

我试图在VisualStudio2008中运行以下代码。但是在运行时程序抛出了一个错误

reverseString.exe中0x002e1480处未处理的异常:0xC0000005: 访问冲突写入位置0x002e573c

void反向(char*str)
{
char*end=str;
char-tmp;
如果(str)
{
while(*结束)
{
++结束;
}
--结束;
while(str

提前感谢您的大力帮助。

反转字符串很简单:

if (str) {
    std::reverse(str, str + strlen(str));
}
然而,这种反转工作的前提是
str
指向一个可写字符串,即它被声明为
char*
,并且不是从字符串文本初始化的!虽然字符串文字可以用于初始化
char*
对象,但它们不一定指向可写内存(在许多现代系统上,它们也不指向可写内存)

如果您想知道
std::reverse()
的简单实现是什么样子的:

template <typename BiDirIt>
void reverse(BiDirIt begin, BiDirIt end) {
    for (; begin != end && begin != --end; ++begin) {
         swap(*begin, *end);
    }
}
模板
无效反向(BiDirIt开始,BiDirIt结束){
for(;begin!=结束和开始!=--end;++begin){
互换(*开始,*结束);
}
}

反转字符串很简单:

if (str) {
    std::reverse(str, str + strlen(str));
}
然而,这种反转工作的前提是
str
指向一个可写字符串,即它被声明为
char*
,并且不是从字符串文本初始化的!虽然字符串文字可以用于初始化
char*
对象,但它们不一定指向可写内存(在许多现代系统上,它们也不指向可写内存)

如果您想知道
std::reverse()
的简单实现是什么样子的:

template <typename BiDirIt>
void reverse(BiDirIt begin, BiDirIt end) {
    for (; begin != end && begin != --end; ++begin) {
         swap(*begin, *end);
    }
}
模板
无效反向(BiDirIt开始,BiDirIt结束){
for(;begin!=结束和开始!=--end;++begin){
互换(*开始,*结束);
}
}
std::reverse(str,str+std::char_traits::length(str));
请注意,反转字符串将导致许多语言和编码的文本中断。

std::reverse(str,str+std::char_traits::length(str));

请注意,反转字符串将导致许多语言和编码的文本中断。

我能够使用你的反转方法,没有任何问题,请参见下文。问题一定是你如何使用你传递的字符

int main()
{
    char str[] = "Hello World!";

    reverse(str);

    cout << str << endl;

    return 0;
}

我能够使用你的反向方法,没有任何问题,见下文。问题一定是你如何使用你传递的字符

int main()
{
    char str[] = "Hello World!";

    reverse(str);

    cout << str << endl;

    return 0;
}

下面是如何从头做起

#include <iostream>

void reverse(char* input)
{
    int size = strlen(input);
    int half = size / 2;

    for(int i = 0; i < half; ++i)
    {
        char temp = input[size - i - 1];
        input[size - i - 1] = input[i];
        input[i] = temp;
    }
}

int main()
{
    char word[] = "hello";
    reverse(word);
    std::cout << word;
}
#包括
无效反向(字符*输入)
{
int size=strlen(输入);
int半=大小/2;
对于(int i=0;istd::cout以下是如何从头开始

#include <iostream>

void reverse(char* input)
{
    int size = strlen(input);
    int half = size / 2;

    for(int i = 0; i < half; ++i)
    {
        char temp = input[size - i - 1];
        input[size - i - 1] = input[i];
        input[i] = temp;
    }
}

int main()
{
    char word[] = "hello";
    reverse(word);
    std::cout << word;
}
#包括
无效反向(字符*输入)
{
int size=strlen(输入);
int半=大小/2;
对于(int i=0;i我想你是这样称呼它的

char* mystr = "Hello";
reverse(mystr);
对吗?但您不能这样做,因为reverse正在修改导致访问冲突的字符串(请参阅)。请按照其他人的建议使用

char mystr[] = "Hello";
reverse(mystr)

也就是说,按照其他人的建议使用std::reverse是一个更好的解决方案。

我认为您这样称呼它

char* mystr = "Hello";
reverse(mystr);
对吗?但您不能这样做,因为reverse正在修改导致访问冲突的字符串(请参阅)。请按照其他人的建议使用

char mystr[] = "Hello";
reverse(mystr)

也就是说,使用其他人建议的std::reverse是一个更好的解决方案。

如果您不喜欢/不想要迭代器或reverse函数,则使用另一种方法

 string revStr(string str){
        if (str.length() <= 1) {
            return str;
        }else{
            return revStr(str.substr(1,str.length()-1)) + str.at(0);
        }
    }
string revStr(string str){

if(str.length()另一种方法,如果您不喜欢/不想要迭代器或反向函数

 string revStr(string str){
        if (str.length() <= 1) {
            return str;
        }else{
            return revStr(str.substr(1,str.length()-1)) + str.at(0);
        }
    }
string revStr(string str){

if(str.length()感谢Dietmar Kuhl,但我正在尝试在不使用任何内置方法的情况下反转字符串。
std::reverse()
不是“内置的”!它只是一个函数模板。if(str){//此行不测试*str是否包含可写内存。@user814064:这是正确的。测试内存是否包含可写内存也不常见。这是调用此函数的先决条件之一。正确。但如果先决条件失败,那么这就是他的程序失败的原因。谢谢Dietmar Kuhl,但我正在尝试to在不使用任何内置方法的情况下反转字符串。
std::reverse()
不是“内置的”!它只是一个函数模板。if(str){//此行不测试*str是否包含可写内存。@user814064:这是正确的。测试内存是否包含可写内存也不常见。这是调用此函数的先决条件之一。正确。但如果先决条件失败,则这就是其程序失败的原因。如何调用reverse?str de如何罚款?可能修改字符串文字?否则听起来很合理,上面的函数用一个字符串文字调用,它会失败!@ EdS。我认为OP是使用C++,他不能使用<代码> STD< /Coo>库。如何调用反向?STR是如何定义的?可能修改字符串文字?否则它工作得很好:听起来很好。AUTHEL,上面的函数用一个字符串文字来调用,它会失败!@ EdS。我认为OP是使用C++的,他不能使用<代码> STD< /代码>库。只是想知道,使用它是否超过了代码> StrLon < /Cord>?我在“<代码> STD::CARYMARGIONS <代码> >下,我完全没有经验和知识渊博。”克里斯:不是ReA。呃,我本来可以说