回 帖 发 新 帖 刷新版面

主题:C语言问题

编写一个函数f(char *s),其功能是把字符串中的内容逆置。例如,字符串
中原有的内容为abcde,则调用该函数后,字符串中的内容为edcba。
  我是个菜鸟,希望哪位帮个忙???

回复列表 (共10个回复)

沙发


char *pf;
main()
{
  char str[]={'a','b','c','d','e'};
  int i,j;
  char *p=str;
  for(i=0;i<5;i++)
   {
      for(j=i+1;j<5;j++)
     {
       if(*(p+i)>*(p+j))break;
       else  
    {*pf=*(p+j);
    *(p+j)=*(p+i);
    *(p+i)=*pf;
        }
      }
    }
  printf("%s",str[]);
}
这是我自己写的,可是用TC编译运行的时候就出问题,这是怎么回事??/

板凳


#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
int main(int argc, char *argv[])
{
  char *pf=(char *)malloc(MAXSIZE*sizeof(char ));    
  char str[]={'a','b','c','d','e','\0'};
  int i,j;
  char *p=str;
  
  for(i=0;i<5;i++)
   {
      for(j=i+1;j<5;j++)
      {
        if(*(p+i)>*(p+j))break;
        else  
        {
       *pf=*(p+j);
           *(p+j)=*(p+i);
           *(p+i)=*pf;
        }
      }
   }
  free(pf); 
  printf("%s",str);
  return 0;
}

这是按照lz最大原意改写的,目前发现的错误有:
1,指针所指元素不能随便修改,在没有分配空间的前提下
2,字符数组初始化,如用以上方式,注意显示加‘\0’
3,printf输出字符串应为str,原因lz应该懂……

3 楼


十分感谢,很受教!!

4 楼


九州娱乐城(ts111.net)各种彩票投注,各种精彩赛事投注,何需往外跑,现在在家就可进得投注,手机也能进行投注,在线棋牌游戏应有尽有,斗地主,德州、台16张麻将等绝对是你最好的选择

5 楼


回答的很精彩 赞!















                       [url=http://www.nl-weixiu.com]能率热水器维修[/url]

6 楼

#include "Stdio.h"
#include "Conio.h"
main()
{
   char *p,*q;
   p="abcdef";
   q=p;
   printf("%s",p);
   while(*p!='\0')
   p++;
   while(p!=q)
   printf("%c",*(p--));
   printf("%c",*p);

   getch();
}
用指针做得,希望能帮到你

7 楼

我自己写了个可以把英文句子倒过来,但单词字母顺序仍为正常顺序。FYI。
比如:
输入 This is a book
输出 book a is This

#include<stdio.h>
#define M 20
void fun(char *x,int m)
{
    char p[M],*x_end,*word_end,*word_begin,*p_start;
    int j=0;

    x_end=x+m-1;
    word_end=x_end;
    word_begin=x_end;
    p_start=p;
    for(;word_begin>=x;word_begin--)
    {
        if(*word_begin==' ')
        {
            char *word_write;
            int k=1;
            word_write=word_begin;
            for(;(word_write+k)<=word_end;k++)
            {
                if(*(word_write+k)!=' ')
                {    
                    *p_start=*(word_write+k);
                    p_start++;
                }
            }
            *p_start=' ';
            p_start++;
            word_end=word_begin;
        }
        else if(word_begin==x)
        {
            char *word_write;
            int k=0;
            word_write=word_begin;
            for(;(word_write+k)<=word_end;k++)
            {
                if(*(word_write+k)!=' ')
                {    
                    *p_start=*(word_write+k);
                    p_start++;
                }
            }
        }
    }
    *p_start='\0';
    for(;p[j]!='\0';j++)
        x[j]=p[j];
    x[j]='\0';
}
void main()
{
    int i,n;
    char a[M];
    printf("Enter n:\n");
    scanf("%d",&n);
    getchar();
    if(n<M)
    {
        printf("The original array:\n");
        for(i=0;i<n;i++)
        *(a+i)=getchar();
        a[i]='\0';
        fun(a,i);
        printf("\nThe array inverted:\n");
        for(i=0;*(a+i)!='\0';i++)
        printf("%c",*(a+i));
        getchar();
        getchar();
    }
}

8 楼

先strlen出数组的长度
然后malloc一个跟这个长度一样长的临时数组
循环一遍,从头到尾扫描原数组,每次把原数组元素复制到临时数组的最后一个非空位置。
完了以后memcpy一下这个临时数组到原数组覆盖
结束后不要忘记free一下这个临时数组

9 楼

我也喜欢这个方法,不过感觉太麻烦

10 楼

哥来写个

void f(char *s)
{
    int i, len = strlen(s);

    for (i = 0; i < len/2; i++)
    {
        *(s+i) = (*(s+i) + *(s+(len-1-i))) - (*(s+(len-1-i)) = *(s+i));   
    }
}

够短吧,呵呵,没编译,但应该可以,去试试吧!

我来回复

您尚未登录,请登录后再回复。点此登录或注册