【问题标题】:Is it possible write a function that can reverse a string without using a buffer string? [duplicate]是否可以编写一个可以在不使用缓冲区字符串的情况下反转字符串的函数? [复制]
【发布时间】:2011-03-19 11:54:42
【问题描述】:

可能重复:
How to reverse a string in place in c using pointers?

面试问题是编写一个名为revstr 的函数,它可以在不使用缓冲区字符串(即涉及指针)的情况下获取字符串并将其反转。我该怎么做?

【问题讨论】:

标签: c


【解决方案1】:

同时从头到尾迭代,交换字符。

void revstr(char * str) {
  int right = strlen(str) - 1;
  int left = 0;
  while (left < right) {
    char c = str[right];
    str[right] = str[left];
    str[left] = c;
    ++left;
    --right;
  }
}

您可以选择使用 xor 技巧在没有中间字符的情况下进行交换:

str[right] ^= str[left];
str[left] ^= str[right];
str[right] ^= str[left];

这纯粹是一种荒谬的交换方式——使用这种结构的唯一原因是一个人为的要求,即不能将字符串数据存储在中间变量中,也不能调用外部函数。

【讨论】:

  • -0.5 用于异或交换。我知道它在这种情况下有效,因为您的条件是left &lt; right,但这是过早的悲观。除非确实需要使代码变慢(例如分析器已将其识别为冷点),否则为什么要使用它?
  • @Steve Jessop:OP“不使用缓冲区字符串” - 只是证明您可以在不中间存储数据的情况下做到这一点。
  • C 标准中没有任何东西可以保证普通交换使用中间存储,或者异或交换不使用,只是一个使用对象而另一个使用右值,所以在抽象上有所不同机器。无论如何,您“使用”leftright 的存储空间比c 的存储空间多。如果您编辑为“愚蠢的异或技巧”,我会给您 +1 ;-p
  • @Steve Jessop:没有 explicit 额外存储字符串数据然后:P - 但你是对的,在这种愚蠢的结构前面应该有一个警告,否则人们可能会在实际代码中实际使用它们。
【解决方案2】:

我认为至少你需要一个 char 变量来执行交换操作。 你可以使用类似的东西:

char buf[SIZE];
   int i ;
   char swap;
      for ( i = 0 ; i < SIZE / 2; i++){
   swap = buf[i];
   buf[i] = buf[SIZE - i];
   buf[SIZE -i] = swap;
   }

【讨论】:

  • 感谢这正是我在 iview 中的程序。希望iviwer喜欢它。
  • 是否可以逆序读取指针?我的意思是这也只会读取字符串。
  • @Nishant:我不明白你的意思,无论如何你当然可以从数组末尾开始 cicle 并递减指针。
猜你喜欢
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
相关资源
最近更新 更多