使用指针反转C++中的字符串
Reversing a string in C++ using pointers
void reverse(char[] x) {
char* pStart = x;
char* pEnd = pStart + sizeof(x) - 2;
while(pStart < pEnd) {
char temp = *pStart;
*pStart = *pEnd;
*pEnd = temp;
pStart++;
pEnd--;
}
}
int main() {
char text[] = ['h','e','l','l','o'];
reverse(text);
cout << text << endl;
return 0;
}
我是C++和堆栈溢出的新手。
我正在尝试使用指针反转字符串...我不太明白我做错了什么。请帮帮我。
附加问题:字符串和字符数组有什么区别?
sizeof(x)
x
是函数char[]
类型的参数,不会给你字符串中的字符数,而是给出char*
的大小,可能在64位系统上8
。您需要传递 C 字符串并改用strlen(x)
。用main
写char text[] = {'h','e','l','l','o',' '}
或char text[] = "hello"
。
请注意,sizeof()
需要在编译时可计算;这在大小不确定的数组(如 char[]
类型函数参数)上是不可能的。但是,当对像char text[] = {'h','e','l','l','o'}
这样的变量使用sizeof
时,sizeof(text)
将导致数组的实际大小。
char x[]
与char* x
相同,因此sizeof(x)
是指针的大小。因此,由于您无法计算声明数组的块之外的数组的大小,因此我会从您的函数中删除该部分。
为函数提供指向要替换的第一个和最后一个字符的指针会容易得多:
void reverse(char* pStart, char* pEnd)
{
while (pStart < pEnd)
{
char temp = *pStart;
*pStart = *pEnd;
*pEnd = temp;
pStart++;
pEnd--;
}
}
所以现在调用这个函数非常容易 - 获取数组中相关字符的地址(使用 & &
):&text[0]
和 &text[4]
。
要显示字符数组,有一条规则,即此类"字符串"必须在最后一个字符之后具有 NULL 字符。NULL 字符可以写为 0
或 ' '
。这就是为什么必须将其添加到此处的数组中的原因。
int main()
{
// char text[] = "hello"; // Same like below, also adds 0 at end BUT !!!in read-only memory!!
char text[] = { 'h', 'e', 'l', 'l', 'o', ' ' };
reverse(&text[0], &text[4]);
std::cout << text << std::endl;
return 0;
}