c++交换字符串

C++ Swap string

本文关键字:字符串 交换 c++      更新时间:2023-10-16

我试图创建一个非递归方法来交换一个c风格的字符串。它在Swap方法中抛出异常。无法解决问题。

void Swap(char *a, char* b)
{
    char temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
void Reverse_String(char * str, int length)
{
    for(int i=0 ; i <= length/2; i++)  //do till the middle
    {
        Swap(str+i, str+length - i);
    }
}

编辑:我知道有更好的方法来做到这一点。但是既然我在学习,想知道代码的问题。

在Swap方法中抛出异常。无法解决问题。

不,它没有。创建临时字符和分配字符不可能引发异常。但是,如果指针不指向自己拥有的内存块,则可能存在访问冲突。

Reverse_String()函数看起来没问题,假设str指向至少length字节的可写内存。你的问题没有足够的背景来推断过去。我怀疑您正在传递无效的参数。您需要展示如何调用Reverse_String(),以便我们确定调用是否有效。

如果你在写这样的东西:

char * str = "Foo";
Reverse_String(str, 3);
printf("Reversed: '%s'.n", str);

那么你肯定会得到一个访问冲突,因为str指向只读内存。试试下面的语法:

char str[] = "Foo";
Reverse_String(str, 3);
printf("Reversed: '%s'.n", str);

这实际上会将"Foo"字符串复制到一个可以覆盖的本地缓冲区。

这个回答是指@user963018在@ andr Caron的回答下发表的评论(它太长了,不能作为评论)

char *str = "Foo";

上面声明了一个指向char数组第一个元素的指针。数组长度为4个字符,F为3个字符,o为3个字符;o和1表示终止NULL字符。数组本身存储在标记为只读的内存中;所以你才会有权限被侵犯的情况。事实上,在c++中,您的声明已被弃用(它允许与C向后兼容),并且您的编译器应该这样警告您。如果不是,试着调高警告级别。你应该使用下面的声明:

const char *str = "Foo";

现在,声明表明str不应该被用来修改它所指向的任何东西,如果你试图这样做,编译器会报错。

char str[] = "Foo";

这个声明声明str是一个包含4个字符(包括NULL字符)的数组。这里的区别在于str的类型是char[N](其中N == 4),而不是char *。但是,如果上下文需要,str可以衰变为指针类型,因此您可以将其传递给需要char *Swap函数。此外,包含Foo的内存不再被标记为只读,因此您可以修改它。

std::string str( "Foo" );

声明了一个std::string类型的对象,包含字符串"Foo"。包含字符串的内存是由字符串对象根据需要动态分配的(有些实现可能包含一个小的私有缓冲区,用于小字符串优化,但现在先不考虑这个)。如果字符串的大小可能会变化,或者在编译时不知道字符串的大小,那么最好使用std::string