C 在下面的代码中,这个reverse()函数是如何工作的?

C 在下面的代码中,这个reverse()函数是如何工作的?,c,pointers,reverse,C,Pointers,Reverse,我在互联网上发现了这段代码,它使用指针反转C中的字符串。 我了解它的大部分内容,但我不了解reverse()函数:它为什么使用length/2 如果我在reverse()函数中将第二个循环中的条件更改为length,它也会显示相同的输出 // function to reverse the string s which is an array of some size void reverse(char *s) { int length, c; char *begin = NUL

我在互联网上发现了这段代码,它使用指针反转C中的字符串。 我了解它的大部分内容,但我不了解
reverse()
函数:它为什么使用
length/2

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

// 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;
}
//用于反转字符串s的函数,该字符串是一个大小一定的数组
无效反向(字符*s){
int长度,c;
char*begin=NULL,*end=NULL,temp;
长度=字符串长度;
begin=s;
结束=秒;
对于(c=0;c
看看在循环中做了什么:

temp = *end;
*end = *begin;
*begin = temp;
这是一些典型的交换代码,在这里交换字符串的两个字符
*begin
*end
。指针从字符串的开始和结束处迭代,并接近中间

使用最简单的示例,让我们看看需要交换多少个字符:

abcd (Original string)
dbca (Swapped 'a' and 'd') - iteration 1
dcba (Swapped 'b' and 'c') - finished after 2 iterations
因此,只需交换一半字符(
length/2
iterations),因为每次操作都会更改其中两个字符。这也解释了为什么更改为
length-1
iterations时会得到原始字符串:

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

看看在循环中做了什么:

temp = *end;
*end = *begin;
*begin = temp;
这是一些典型的交换代码,在这里交换字符串的两个字符
*begin
*end
。指针从字符串的开始和结束处迭代,并接近中间

使用最简单的示例,让我们看看需要交换多少个字符:

abcd (Original string)
dbca (Swapped 'a' and 'd') - iteration 1
dcba (Swapped 'b' and 'c') - finished after 2 iterations
因此,只需交换一半字符(
length/2
iterations),因为每次操作都会更改其中两个字符。这也解释了为什么更改为
length-1
iterations时会得到原始字符串:

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

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

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

让我们使用一个简单的比较:

  • 你每只手都有一个球,比如说右手拿一个黑色的,左手拿一个白色的
  • 如果你交换一次球,你就有效地扭转了局面
  • 但是如果你交换两次球,你就会回到原来的状态
  • 因此,交换的数量必须是球数量的一半
字符串中的字母也是如此,如果执行
length
swap,将获得原始字符串。要获得反向字符串,必须在字符串长度的一半处停止

还要注意,代码比要求的复杂。以下是一个简化版本:

// 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;
    }
}
//用于反转字符串s的函数,该字符串是一个大小一定的数组
无效反向(字符*s){
字符*开始,*结束;
对于(end=begin=s;*end;end++)
继续;
while(开始<结束){
字符温度=*开始;
*开始+=*--结束;
*结束=温度;
}
}

让我们用一个简单的比较:

  • 你每只手都有一个球,比如说右手拿一个黑色的,左手拿一个白色的
  • 如果你交换一次球,你就有效地扭转了局面
  • 但是如果你交换两次球,你就会回到原来的状态
  • 因此,交换的数量必须是球数量的一半
字符串中的字母也是如此,如果执行
length
swap,将获得原始字符串。要获得反向字符串,必须在字符串长度的一半处停止

还要注意,代码比要求的复杂。以下是一个简化版本:

// 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;
    }
}
//用于反转字符串s的函数,该字符串是一个大小一定的数组
无效反向(字符*s){
字符*开始,*结束;
对于(end=begin=s;*end;end++)
继续;
while(开始<结束){
字符温度=*开始;
*开始+=*--结束;
*结束=温度;
}
}

尝试在一个小字符串上手动执行此代码,您将看到原因;)我确实这么做了,如果我听起来很愚蠢,我很抱歉,但我仍然不明白“长度/2”部分是在做什么。我理解“长度-1”的逻辑。我只是一个初学者,如果你检查
length/2
,你会还原你所做的所有更改,最终得到的原始字符串保持不变。想象一下
abcdef
:1)
swap(a,f)
2)
swap(b,e)
3)
swap(c,d)
。理想情况下,您现在应该停止,并最终得到:
fedcba
。如果您继续,那么您将执行:4)
swap(c,d)
,5)
swap(b,e)
6)
swap(a,f)
,您将以<代码>abcdef
再次。尝试在一个小字符串上手动执行此代码,您将看到原因;)我确实这么做了,如果我听起来很愚蠢,我很抱歉,但我仍然不明白“长度/2”部分是在做什么。我理解“长度-1”的逻辑。我只是一个初学者,如果你检查
length/2
,你会还原你所做的所有更改,最终得到的原始字符串保持不变。想象一下
abcdef
:1)
swap(a,f)
2)
swap(b,e