有没有办法在C
中用最小(可能是单行)源代码行来反转字符串。
C ++支持使用#include <algorithm>
建议here。
我想知道C是否也支持任何这样的机制。
答案 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);
解释代码的工作原理: -
变量: -
国: -
终止: -
当指向字符串前半部分的指针超出指向字符串后半部分的指针时,循环终止。在搜索字符串结尾时,指向前半部分(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);