【问题标题】:How does this reverseString algorithm work?这个 reverseString 算法是如何工作的?
【发布时间】:2013-01-07 06:41:31
【问题描述】:

我在网上看到了这个算法来反转一个字符串,我对此有一些疑问,我将在代码末尾指定:

    void reverseString(char *original_string)
    {
        char *end = original_string;
        char tmp;

        if(original_string) {
            while(*end) {
                ++end;
            }
            --end;
            while (original_string < end) {
                tmp = *original_string;
                *original_string++ = *end;
                *end-- = tmp;
            }
        }
//This line doesn't have the complete reversed string. Why?
printf("%s\n", original_string);
    }

1) 在while循环中...为什么要比较两个指针?我们怎么知道这个值会变大还是变小?这些只是指针,对吧?

2) 为什么我们不返回任何东西?反转的字符串在哪里?如果我们暗示反转的字符串在 original_string 中,我们不应该使用指向指针的指针以使效果在外部范围内吗?

3) 如果我执行以下操作:

char test[] = "hello";
    reverseString(test);
    printf("%s\n", test);

我可以看到“olleh”。但是,如果我在函数 reverseString 的最后一行执行printf("%s\n", original_string);,我只会得到“leh”。这是为什么呢?

【问题讨论】:

    标签: c string reverse


    【解决方案1】:

    你有两个指针指向要反转的部分的开头和结尾。在每一步中,您交换这些指针指向的字符,然后减少要从两个方向(开始和结束)反转的字符串。比较指针有以下含义——直到区间的开始不是在区间的结束之后,我们还有一个区间要反转。希望这是有道理的。

    您不需要返回任何内容 - 字符串被反转,因此参数同时输入和输出。

    3) 在函数中,您获取指向字符串的指针的副本,您在其执行期间对其进行修改,因此当指针被最后一行修改时,它将不再指向字符串的开头,而是指向中间,放在最后。

    【讨论】:

    • 但是在 while(original_string
    • 数组在内存中表示为单个内存块,每个元素都放在前一个元素之后。所以对于数组来说,指向元素的指针和它的索引之间有直接的关系。
    • 好的,现在说得通了!我忘了问另一件事。为什么从外部打印字符串时结果是正确的,但是从方法的最后一行,我没有得到完整的反转字符串?
    • 这很有趣。因此,由于我们使用的是副本,因此它位于中间,但我们正在更改内容,这就是为什么从外部指针定位良好并且其内容已更改的原因。正确的?这太棒了。
    • 您修改了指针的副本,而不是字符串的副本,您修改了函数中的指针,但由于它是副本,当返回指针时,不会像我们使用 副本那样修改 给它。
    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 2021-04-11
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多