使用指针反转C++中的字符串

Reversing a string in C++ using pointers

本文关键字:字符串 C++ 指针      更新时间:2023-10-16
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)。用mainchar 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;
}