我在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;
}
答案 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
,则需要反转字符串,然后再将其反转回原来的字符串。