说在前面的话
字符串操作在很多 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博客 ” ,链接:http://blog.itpub.net/31561984/viewspace-2221177/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31561984/viewspace-2221177/