c - 用于反转弦的单衬

标签 c

有没有办法反转 C 中的字符串具有最少(可能是一行)源代码行。 C++ 通过使用 #include <algorithm> 支持这一点按照建议here 。 我想知道 C 是否也支持这样的机制。

最佳答案

这是一个不使用任何库函数的单行代码(某种意义上,需要声明变量):-

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:两个目的,指向字符串的开头并用于状态

州:-

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

终止:-

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

递增:-

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中明显不必要的*的原因是为了确保三元运算符的所有部分具有相同的类型。

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

关于c - 用于反转弦的单衬,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17697241/

相关文章:

c - Bison解析全局变量和函数

c - 将 zSql arg 释放到 sqlite3_prepare_v2?

c - 关闭文件的文件号

c - 格式为\Unnnnnnnn 的 Unicode 代码点

c - C中B+树的简单实现

C:插入排序逻辑无法使用指针和结构来工作

C 和 libappindicator - 创建多个指标

C 堆栈错误链接列表

当数据复制/扫描/读取到未初始化的指针时崩溃或 "segmentation fault"

c - c 中奇怪的段错误