下面的代码中的reverse()函数如何工作?

时间:2019-06-24 14:46:27

标签: c pointers reverse

我在Internet上找到了此代码,该代码使用指针来反转C中的字符串。 我最了解它,但不了解reverse()函数:为什么使用length / 2

如果我在for函数的第二个length循环中将条件更改为reverse(),它也会显示相同的输出。

// function to reverse the string s which is an array of some size
void reverse(char *s) {
    int length, c;
    char *begin = NULL, *end = NULL, temp;

    length = string_length(s);
    begin = s;
    end = s;

    for (c = 0; c < length - 1; c++)
        end++;

    for (c = 0; c < length / 2; c++) {
        temp = *end;
        *end = *begin;
        *begin = temp;

        begin++;
        end--;
    }
}

int string_length(char *pointer) {
    int c = 0;

    while (*(pointer + c) != '\0')
        c++;

    return c;
}

3 个答案:

答案 0 :(得分:2)

让我们比较一下:

  • 每只手都有一个球,右手说一个黑色的球,左手说一个白色的球。
  • 如果一次交换球,则可以有效地扭转这种情况。
  • 但是如果您两次交换球,您将回到原始状态。
  • 因此,交换次数必须是球数的一半。

字符串中的字母也一样,如果执行length交换,则会得到原始字符串。要获得反向字符串,您必须停在字符串长度的一半处。

还要注意,代码比所需的要复杂。这是一个简化的版本:

// function to reverse the string s which is an array of some size
void reverse(char *s) {
    char *begin, *end;

    for (end = begin = s; *end; end++)
        continue;

    while (begin < end) {
        char temp = *begin;
        *begin++ = *--end;
        *end = temp;
    }
}

答案 1 :(得分:0)

看看循环中完成了什么

temp = *end;
*end = *begin;
*begin = temp;

这是一些典型的交换代码,在这里交换字符串的两个字符*begin*end。指针从字符串的开头和结尾开始迭代,并到达中间。

使用最小示例abcd,让我们看看我们必须交换多少个字符:

abcd (Original string)
dbca (Swapped 'a' and 'd') - iteration 1
dcba (Swapped 'b' and 'c') - finished after 2 iterations

因此,您只需要交换一半字符(length / 2迭代),因为每次操作都要更改其中两个。这也解释了为什么更改为length - 1迭代时会得到原始字符串:

dcba (result from above after 2 iterations)
dbca (Swapped 'c' and 'b') - iteration 3
abcd (Swapped 'd' and 'a') - original string after 4 iterations

答案 2 :(得分:0)

由于c为0时,将交换s[0]s[length-1]处的元素。当c为1时,将交换s[1]s[length-2]处的元素,依此类推。如果您使用length而不是length/2,则需要反转字符串,然后再将其反转回原来的字符串。