C语言 把字符串前后倒置

下面是引用的fun函数,请帮我看下错哪了
void fun(char*s)
{
int i,j=0,n;
char *t=s;
n=strlen(s);
for(i=n-1;i>0;i--)
t[j++]=s[i];
for(i=0;i<n;i++)
s[i]=t[i];
s[++i]='\0';
}

你这里的*t = s; 只表示定义了一个新指针,还是指向原来s数组存储的空间。

其实完全可以一次循环搞定,第0位置与第n-1个位置互换就行了,依次类推,

n为偶数时,n/2 - 1 与 n/2互换,如n为10,则0-9位置有效,4和5换;

n为奇数时,n/2 - 1 与 n/2 + 1互换,如n为11时,0-10位置有效,5在中间,4和6换;

实际上是循环n/2次,i 与 [(n-1) - i ]互换。

注意的是第n位置是'\0',不用换。

void fun(char*s)
{
   int i,j=0,n;
   char temp;
   n=strlen(s);
    for(i=0;i<n/2;i++){
        temp = s[i];
        s[i] = s[n-1-i];
        s[n-1-i] = temp;
    }
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-02

这样改就好了:

void fun(char*s)
{
int i,j=0,n;
char t[100];//t不要和s指向同一个字符串,不然后面的赋值操作有点乱套。
n=strlen(s);
for(i=n-1;i>=0;i--)//i==0的时候也要复制过去。
t[j++]=s[i];
for(i=0;i<n;i++)
s[i]=t[i];
s[++i]='\0';
}

本回答被提问者采纳
第2个回答  2013-09-18

可以之间调用库函数strrev()

你可以这样写:

void srev(char *s)
{
    char *p = s, *q = &s[strlen(s)-1];
    char tmp;
    
    while(p<q)
    {
    tmp = *p;
    *p = *q;
    *q = tmp;
    p++, q--;
   }      
}

第3个回答  2013-09-18
一楼打的不错,不过你直接把上面
char str,int i;
for(i=0;i<n/2;i++)
{
str=*(s+i);
*(s+i)=*(s+n-1-i);
*(s+n-1-i)=str;
}
就OK 了,没有必要新占用内存。直接操作指针就OK了
相似回答