单线用于反转弦

时间:2013-07-17 10:23:49

标签: c

有没有办法在C中用最小(可能是单行)源代码行来反转字符串。 C ++支持使用#include <algorithm>建议here。 我想知道C是否也支持任何这样的机制。

7 个答案:

答案 0 :(得分:7)

这是一个不使用任何库函数的单行(需要声明变量): -

char s [] = "hello world";
char *p,*q;
for (p=s,q=0;p>q;q?*p^=*q,*q^=*p,*p--^=*q++:!*++p?q=s,*--p:0);

解释代码的工作原理: -

变量: -

  • p:字符串指针的结尾,初始化为字符串的开头,用于查找结尾
  • q:两个pruposes,指向字符串的开头并用于状态

国: -

  • q == 0:for循环正在搜索输入字符串的结尾,p正在递增以查找结束
  • q!= 0:for循环是从字符串的前半部分和字符串的后半部分交换字符

终止: -

当指向字符串前半部分的指针超出指向字符串后半部分的指针时,循环终止。在搜索字符串结尾时,指向前半部分(q)的指针为0,因此条件始终为真。

递增: -

for循环的第三部分取决于状态,可以这样分解: -

if state is searching for end of string (q == 0)
  increment end of string pointer (++p)
  if end of string pointer is pointing at null terminator (*p == 0)
    set start of string pointer and set state to swapping characters (q=s)
    decrement end of string pointer (--p)
  endif
else
  swap characters (the three ^=)
  move first and secondhalf pointers (--p, ++q)
endif

*中显然不必要的*--p的原因是为了确保三元运算符的所有部分具有相同的类型。

如果您了解所有这些,那么您应该发现代码中的错误。

答案 1 :(得分:5)

“最小行数”要求不会使 更有意义(毕竟,整个程序可以写成一行)。如果你愿意进行就地反转,你可以拥有一个相当轻量级的实现:

void strrev(char *s) {
    char *p = s + strlen(s);
    while ( s + 1 < p ) {
        char tmp = *s;
        *s++ = *--p;
        *p = tmp;
    }
}

答案 2 :(得分:3)

#include <string.h>
char *strrev(char *string);

<强>描述 strrev反转给定字符串中字符的顺序。结束的空字符(\ 0)保持不变。

<强>返回

strrev返回指向已更改字符串的指针。没有错误返回值

仅适用于WINDOWS

答案 3 :(得分:2)

不,没有用于反转字符串(或其他序列或范围)的标准C库例程。

答案 4 :(得分:1)

#include <stdio.h>

int strrev_r(char *str, int pos){
    char ch = str[pos];
    return (ch == '\0')? 0 : ((str[pos=strrev_r(str, ++pos)]=ch), ++pos);
}
void strrev(char *str){
    strrev_r(str, 0);
}

int main(){
    char string[] = "string";
    strrev(string);
    puts(string);
    return 0;
}

答案 5 :(得分:0)

你好,这不是一行,但它完美地运作

#include<stdio.h>
#include<string.h>

char *revstr(char *str)
{
  int   i;
  int   size;
  int   max;
  char  save;

  i = 0;
  size = strlen(str);
  max = size / 2;
  while (i < max)
    {
      save = str[i];
      str[i] = str[size - 1 - i];
      str[size - 1 -i] = save;
      i = i + 1;
    }
  return(str);
}

int main()
{
  char *str;

  str = strdup("hello");
  str = revstr(str);
  printf("%s\n", str);
}

答案 6 :(得分:0)

如果你坚持使用一个衬垫,你将得到一个衬垫。

for(int i = -1, len = strlen(s), t = 0; ++i < len / 2; t = s[i], s[i] = s[len - 1 - i], s[len - 1 - i] = t);