C ++交换字符串

时间:2011-09-24 20:57:47

标签: c++

我正在尝试创建一个非递归方法来交换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);

    }

}
编辑:我知道有更好的方法可以做到这一点。但是因为我正在学习,想知道代码的问题。

2 个答案:

答案 0 :(得分:7)

  

它在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"字符串的副本复制到您可以覆盖的本地缓冲区中。

答案 1 :(得分:2)

这个答案是指在@AndréCaron的answer下发表的@ user963018的评论(评论太长了。)

char *str = "Foo";

上面声明了一个指向char数组的第一个元素的指针。该数组长度为4个字符,3个用于Fo&amp; o和1表示终止NULL字符。数组本身存储在标记为只读的内存中;这就是你获得访问冲突的原因。事实上,在C ++中,您的声明已被弃用(允许向后兼容C),您的编译器应该警告您。如果不是,请尝试调高警告级别。您应该使用以下声明:

const char *str = "Foo";

现在,声明表明不应该使用str来修改它指向的任何内容,如果您尝试这样做,编译器会抱怨。

char str[] = "Foo";

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

Foo

这声明了一个类型为std::string str( "Foo" ); 的对象,其中包含字符串“Foo”。包含字符串的内存由字符串对象根据需要动态分配(某些实现可能包含用于小字符串优化的小型私有缓冲区,但暂时忘记了)。如果您的字符串大小可能不同,或者您在编译时不知道其大小,则最好使用std::string