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 [ ]类型)就不存在内存“段错误”问题。其内容存储在堆上可以直接修改。

    深藏功与名!

  • 相关阅读:
    GSS3 SPOJ 1716. Can you answer these queries III gss1的变形
    GSS1 spoj 1043 Can you answer these queries I 最大子段和
    Codeforces Round #197 (Div. 2) C,D两题
    sgu 185 最短路建网络流
    CF 208E
    QTREE2 spoj 913. Query on a tree II 经典的倍增思想
    BZOJ 1146: [CTSC2008]网络管理Network 树链剖分+线段树+平衡树
    ubuntu安装vim
    历史背景更新模型
    码本模型
  • 原文地址:https://www.cnblogs.com/McQueen1987/p/3546729.html
Copyright © 2011-2022 走看看