我正在尝试创建一个非递归方法来交换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);
}
}
编辑:我知道有更好的方法可以做到这一点。但是因为我正在学习,想知道代码的问题。
答案 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个用于F
,o
&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
。