C 在下面的代码中,这个reverse()函数是如何工作的?
我在互联网上发现了这段代码,它使用指针反转C中的字符串。 我了解它的大部分内容,但我不了解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
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