gpt4 book ai didi

c - 解释这个 C 代码来反转一个字符串

转载 作者:太空狗 更新时间:2023-10-29 15:47:04 26 4
gpt4 key购买 nike

我真的不明白最后一个 while 循环在做什么,谁能解释一下?

void reverse(char *str) { 
char * end = str;
char tmp;

if (str) {
while (*end) {
++end;
}
--end;
while (str < end) {
tmp = *str;
*str++ = *end;
*end-- = tmp;
}
}
}

谁能带我看一下“你好”这个例子?

最佳答案

此代码背后的基本思想是分两步进行:

  1. 在第一遍中,我们以指向字符串最后一个字符的指针结束。
  2. 在第二遍中,我们在了解字符串结束位置的帮助下转动字符串。

第一遍由以下逻辑给出:

char *end = str;
while (*end) {
++end;
}
--end;

while 循环以指向字符串开头的 end 指针开始。然后,它不断地将 end 指针向前移动一步,直到循环条件 *end 不再计算为真。因为 C 字符串以 null 终止,所以只要 end 指针指向字符串中间的某处而不是字符串末尾的 null 终止符,循环条件就会计算为真。因此,当此循环结束时,end 指针将一直走到字符串的末尾并停在空终止符处。然后我们执行 --end 来备份指针一步。此时,end 指针指向字符串中的最后一个字符。这是一个带有“你好:”的例子

 H e l l o
^ ^
| |
str end

现在我们有了这个 end 指针,我们实际上运行逻辑来反转字符串。这是由这段代码给出的:

while (str < end) {
tmp = *str;
*str++ = *end;
*end-- = tmp;
}

这段代码背后的想法是,在字符串的起始指针和结束指针相互交叉之前,我们交换它们指向的值,然后将两个指针向内移向彼此。如果我们通过稍微更冗长的方式将其重写为等价物

while (str < end) {
tmp = *str;
*str = *end;
*end = tmp;

++str;
--end;
}

然后可能更容易理解它是如何工作的。这个修改后的循环的前三行交换开始和结束指针指向的值,接下来的两行将指针向内移动。这是一个例子:

 H e l l o
^ ^
| |
str end

o e l l H
^ ^
| |
str end

o l l e H
^
|
str end

此时,两个指针相遇,我们就正确地反转了字符串。

请注意,这里我们必须考虑一个不寻常的边缘情况,这就是当字符串为空字符串时会发生的情况。如果发生这种情况,那么第一个循环的行为会有点奇怪。特别是这段代码:

char *end = str;
while (*end) {
++end;
}
--end;

永远不会执行循环体,因为 end 指针将从指向空终止符开始。因此,该循环什么都不做,我们最终在字符串开始前返回 end 一个步骤! 这是一个无效指针,取消引用它会产生未定义的结果。但幸运的是,在这种情况下,什么也没有发生,因为反转字符串的循环有这样的条件:

while (str < end)

如果 end 是字符串开始前的一步,则立即为 false,因此什么也不会发生。

希望这对您有所帮助!

关于c - 解释这个 C 代码来反转一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5072806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com