c - 编写代码以在适当的位置反转 C 风格的字符串

标签 c string

我知道这个问题已经被问过很多次了,但我只是对下面的代码有几个问题。

所以下面的代码不起作用,因为在我的 while 循环中我有 str != end而不是 str < end .为什么必须是 str < end ?我很困惑,因为它看起来像是 str != end 的情况应该以相同的方式工作,因为指针最终将指向相同的位置。

我的第二个问题是为什么我们必须做 while(*end){end++;}而不是 while(end){end++} .无论如何,当我们移动超过 end 的长度时,指针是否无效?什么是 while(end){end++}如果不正确该怎么办?

我的最后一个问题是,在这段代码的其他变体中,我看到一个条件被添加到这个函数的顶部,它说 if(!(*str)){return;} .这是必要的吗?没有这个,我的代码似乎可以很好地处理空字符串。此外,类似于 *end对比end ,为什么我们要做!(*str)而不是 !(str)

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

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

最佳答案

您同时递增str 递减end (str++; end--;)。因此,当您比较它们时,它们可能会相互跳跃并且永远不会相等。

在您当前的实现中,如果传递了一个空字符串 (*str==0),那么您仍然无条件地递减 end (end--,函数的第 5 行)。所以现在看起来 str starts out 大于 end 如果 str!=end 是在你的循环中有条件(我说“看起来像”是因为,作为 pointed out by Cornstalks ,它实际上是未定义的行为——在某些情况下,编译器可能会调整 end 以便指向太远str)。无论如何,当您取消引用 end 时,这是更糟糕的消息,因为您可能会弄乱未分配的内存。

至于你关于 !(*str) 的问题:如果 *str==0 意味着字符串是空的,而如果 str== 0 表示调用函数向您传递了一个 NULL 字符串指针。您应该检查这两种可能性——具体来说,为了避免宇宙爆炸,首先检查指针是否为 NULL,您尝试取消引用它之前。

关于c - 编写代码以在适当的位置反转 C 风格的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27606545/

相关文章:

mysql - 检查数据库中的条目是否可用

c# - 如何用多个字符替换一个字符c#

发送指针时按引用调用 C

c++ - ASCII 艺术 - C/C++ 中的固定边框

c - 最小-最大选择——那是什么算法?

c - 在这种情况下 malloc 和 realloc 会发生什么

Java程序,字符串

c - Gstreamer:如何在 C 中设置 videomixer sink_0 上限

c - 通过函数返回数组时出错

c++ - 一个字符串开始另一个字符串是什么意思? C++