c++交换字符串
C++ Swap string
我试图创建一个非递归方法来交换一个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
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
。
- 交换两个字符串时访问正确的内存时,我遇到了分段错误
- 使用 DLL 在 c++ 和 C# 之间交换字符串
- 为什么我在字符串交换程序中得到错误的输出
- 为什么我的交换<字符串,字符串>比标准版本慢得多?
- 排列函数和交换字符串值的问题
- 如何使用C++引用交换两个 C 样式字符串
- 正在交换字符串数组中的字符
- C++交换字符串中两个字符的程序
- 交换字符串数组中的字符串
- 递归字符串交换
- 在c++中使用冒泡排序/交换对字符串进行排序
- 如何交换在函数中作为指针传递的 2 个字符串
- C++:反转数组中的字符串.在两个不同的数组之间交换字符串
- 分析字符串并交换子字符串
- c++字符串交换字符位置
- 使用结束符的位置作为交换空间反转以空结尾的字符串
- 字符串::交换可忽略,因为 std::swap(s1, s2) 就足够了
- c++交换字符串
- 我需要将字符串中的两个值交换为一个(c++)
- c++字符串交换.为什么它会起作用?