ITPub博客

首页 > 应用开发 > C/C++ > C 实现 删除字符串空白符的函数 strtrim

C 实现 删除字符串空白符的函数 strtrim

原创 C/C++ 作者:LinuxDevqqqqqq 时间:2018-11-22 16:18:41 0 删除 编辑

说在前面的话

字符串操作在很多 C 语言比赛里面都有涉及,最近公众号里面的 C 语言比赛,都是两个关于字符串操作的题目,希望大家认真看题目。

 

直接上代码

/*************************************************************************

     > File Name: trim.c

     > Author: 

     > Mail: 

     > Created Time: Mon 12 Nov 2018 10:16:04 AM CST

 ************************************************************************/

 

#include <stdio.h>

 

/*****************************************************************************

  函 数 名   : strtrim

  功能描述   :  删除行首、行尾空白符号

  输入参数   : char *is 

  输出参数   :  无

  返 回 值   : char *

  调用函数   : 

  被调函数   : 

 

  修改历史       :

  1. 日      期    : 2018 年 11 月 12 日

     作      者    : strtrim

     修改内容    :  新生成函数

 

*****************************************************************************/

char * strtrim ( char * s) {

     char * p  = s;

     char * q  = s;

 

     // 去掉行首的空格

     while ( * p == ' ' || * p == '\t' ) 

         ++ p;

     // 赋值

     while ((p  != NULL ) && (q  != NULL ) && ( * p  != '\0' ) && ( * p  != '\0' ))

    {

         * q ++ = * p ++ ;

    };

 

      // 删除 '\0' 字符 注意是 -2  上面 q++ 是先操作再自加

    q  -= 2 ;

     // 去掉行末的空格

     while ( * q == ' ' || * q == '\t' ) 

         -- q;

     // 给字符串添加字符结束标志

     * (q + 1 )  = '\0' ;

     // 这里的 return s 要注意看好

     // 因为 p q 经过一系列操作后,已经不是原来的位置,越界了 , s 还在原来位置,所以 return s 才是正确的。

     return s;

}

 

/*****************************************************************************

  函 数 名   : strtrimc

  功能描述   :  删除字符串空白符 , 包括行首和行尾

  输入参数   : char * s

  输出参数   :  无

  返 回 值   : char *

  调用函数   : 

  被调函数   : 

 

  修改历史       :

  1. 日      期    : 2018 年 11 月 12 日

     作      者    : strtrim

     修改内容    :  新生成函数

 

*****************************************************************************/

char * strtrimc ( char * s )

{

     char * p1  = s;

      char * p2  = s;

      while ( * p1  != '\0' )

     {

          while ( * p1  == ' ' || * p1  == '\t' )

         {

              p1  ++ ;

         }

          * p2  ++ = * p1 ++ ;

     }

      * p2  = '\0' ;

      return (s);

}

void main ( void )

{

      char str[ 1000 ] = { " adf asdfasldf jjjjjjjjj    iiii " };

      char str1[ 1000 ] = { " adf asdfasldf jjjjjjjjj    iiii " };

     puts( "Start main." );

    printf( "%s\n" ,strtrimc(str));

     printf( "%s\n" ,strtrim(str1));

}

运行结果

<img src="https://pic1.zhimg.com/v2-8a63cf946682cfbd00b713f82b4c0ab4_b.jpg" data-caption="" data-size="normal" data-rawwidth="517" data-rawheight="86" class="origin_image zh-lightbox-thumb" width="517" data-original="https://pic1.zhimg.com/v2-8a63cf946682cfbd00b713f82b4c0ab4_r.jpg">

注意问题

1  常量区

刚开始的时候,我写的是 char * s = "adfasdfasdfsf adfasdf adfasdfad ";

然后出现段错误,这里定义的 s ,保存在的是常量区,所以不能做赋值等操作,大家对字符串操作的时候要特别注意。

 

2  指针的返回值问题

<img src="https://pic2.zhimg.com/v2-a0a20ac82107e53ed414d00f8bf849d1_b.jpg" data-caption="" data-size="normal" data-rawwidth="765" data-rawheight="451" class="origin_image zh-lightbox-thumb" width="765" data-original="https://pic2.zhimg.com/v2-a0a20ac82107e53ed414d00f8bf849d1_r.jpg">

原来我返回的是 p1 ,p1 p2 s 原来是相等的,但是经过一系列运算后,他们的值已经不相等了,他们的值如上面显示那样,所以返回值一直要返回 s 。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31561984/viewspace-2221177/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
微信公众号-嵌入式Linux 嵌入式开发有10余年,从刚开始的STC89C51单片机,STM32单片机,ARM,Linux ,Nordic ble ,Android系统开发,在学习和开发过程中,积累了很多经验,希望这些学习经验跟在码农路上一起奋斗的同学们一起分享。

注册时间:2018-11-13

  • 博文量
    61
  • 访问量
    133407