zoukankan      html  css  js  c++  java
  • c:翻转一个长句中的每个单词

    问题:

    输入:“how are    you     baby--   "

    输出:”woh era    uoy     --ybab   "

    #include<stdio.h>
    #include<string.h>
    #define SWAP(a,b) (a)^=(b);(b)^=(a);(a)^=(b)
    
    char* sentenceReverse(char* input){
            if(NULL == input) return;
            char *r,*f;
            char *inp = (char*)malloc(sizeof(char)*(strlen(input)+1));
            //当input是const时其内容不能修改,此时需要在堆上new一个新数组;
            strcpy(inp,input);
            r=f=inp;
            printf("input is:%s-----
    ",inp);
            char *rear,*front;//用于标记一个单词的词首和词尾
            while(*r){
                    while(*r==' ') r++;
                    f=r;
                    while(*r!=' ' && *r!='') r++;
                    r--;
                    front=f;rear=r;
                    while(rear > front){//翻转一个单词
                            SWAP(*rear,*front);
                            front++;
                            rear--;
                    }
                    if(*(++r)=='') break;
            }
            return inp;
    }
    
    int main(){
            char test1[]="1oow   lsije     ";
            char *test2="sdklf  ";
            char *ret2;
            printf("test1 result is:%s-----
    ",ret2=sentenceReverse(test1));
            printf("test2 result is:%s-----
    ",sentenceReverse(test2));
            free(ret2);//free掉malloc开辟的空间
            return 0;
    }

    输出结果:

    xu@xu-ThinkPad-X61:~/algorithm$ gcc sentenceReverse.c
    xu@xu-ThinkPad-X61:~/algorithm$ ./a.out
    input is:1oow lsije -----
    test1 result is:woo1 ejisl -----
    input is:sdklf -----
    test2 result is:flkds -----

    总结:

    一,当函数参数是test2时(注意它声明时是char * 类型),内存做了以下操作:1.在堆上保存test2指针。2.将其内容:"sdklf "保存在“常量区”(具体我也不清楚,反正该区域内容不能修改)。找到下面连接,问题解释的比较清晰:

    http://blog.chinaunix.net/uid-26456800-id-3262510.html

    二,当函数sentenceReverse()对数组char *test2内容修改时,总会报错“

    段错误 (核心已转储)”。

    三,解决方案:在堆上重新开辟新空间进行操作。如上函数中新建数组inp[ ];

    四,当函数参数是test1时(注意是它声明时是char [ ]类型)就不存在内存“段错误”问题。其内容存储在堆上可以直接修改。

    深藏功与名!

  • 相关阅读:
    35个Java代码优化的细节,你知道几个?
    Java如何优雅地实现接口数据校验
    Java中方法的重载详解(含系统配套视频)
    七大经典、常用排序算法的原理、Java 实现以及算法分析
    Java静态方法和实例方法
    Java静态变量和实例变量
    “反转链表”相关的题目
    【C++】将十进制数转换为十六进制数
    第四章:动态规划I
    【C++】数组中的第k个最小元素
  • 原文地址:https://www.cnblogs.com/McQueen1987/p/3546729.html
Copyright © 2011-2022 走看看