字符串空格替换或删除
来源:互联网 发布:知乎 怎么死最舒服 编辑:程序博客网 时间:2024/05/18 03:56
1.将一个字符串里面的空格替换成%20,不考虑字符数组大小溢出,不得使用库函数
2.将一个字符串里面的一个或多个空格替换成一个空格
这两道题都是关于字符串替换,不同的是第一道题是将一个空格替换为3个字符%20,当然这里任意3个字符都可以,而且只要保证数组大小足够大,一个空格替换成多个也无所谓,本质上是将一个字符替换成多个字符从而增加原字符的长度。
而第二个的话则是将多个字符(只不过是相同的)替换成一个字符,从而减小原字符串的长度。
对于第一道题,可以这么考虑,先遍历字符串求取原来的字符串长度oldLen和空格个数blankNum,由题可知每多一个空格字符串长度就增加(3-1)个即新字符串的长度newLen=oldLen+2*blankNum,最后将原来的字符串自后向前拷贝到新的空间,如图所示,以hi usa为例。
代码如下:
void replaceBlank(char *str){assert(str);int oldLen = 0;int newLen = 0;int blankNum = 0;//两种求oldLen的方法//char *p = str;//while (*p != '\0') {//if (*p == ' ')//blankNum++;//p++;//}//oldLen = p - str;while (str[oldLen] != '\0') {if (str[oldLen] == ' ')blankNum++;oldLen++;}newLen = oldLen + 2 * blankNum;while (newLen >= 0){if (str[oldLen] == ' ') {str[newLen--] = '0';str[newLen--] = '2';str[newLen--] = '%';oldLen--;}elsestr[newLen--] = str[oldLen--];}}
对于第二题,我自己是这么考虑的,还是遍历整个字符串,在遍历的过程中遇到非空格指针string++,遇到第一个空格的时候不管还是string++, 直到遇到第二个空格记下第二个空格的位置p=string,然后string指针继续走看是否还有连续的空格直到遇到非空格,此时string指针指向非空格的位置,然后将string及以后字符串拷贝到p以后位置,如图所示(即字符串is a man\0整体向前移动一位)。
那么为什么还要设置一个q指针来保存遇到第二个空格时候string的位置呢?
那是因为在拷贝的时候*p++=*string++指针p和string位置都变化了,需要有个q指针保存之前的位置从而string好定位,来继续执行循环。(移动完字符串如下图)
代码如下
void deblank(char *string){int flag = 0;while (*string != '\0') {if (*string != ' ') {string++;flag = 0;}else {if (flag == 0) {string++;flag = 1;}else if (flag == 1) {char *p = string;//指针p q记下当前指针的位置char *q = string;while (*string == ' ')string++;while (*string != '\0') {*p++ = *string++;}*p = '\0';//两种拷贝字符串的方法//while (*p++ = *string++)//;string = q;}}}}
C和指针书上给出另一种实现方式,设置两个指针src和dst,让src先走,执行src向dst的拷贝,遇到非空格直接拷贝,遇到空格看前面一个是否是空格,如果不是就拷贝否则就不操作。
代码如下
int is_white(int ch) { return ch == ' ' || ch == '\t' || ch == '\v' || ch == '\f' || ch == '\n' || ch == '\r'; }void deblank(char *string){int ch = ' ';char *src = string;char *dst = string++;while ((ch = *src++) != '\0') {if (is_white(ch)) {if (src == string || !is_white(*(dst - 1))) {*dst++ = ' ';}}else {*dst++ = ch;}}*dst = '\0';}
0 0
- 字符串空格替换或删除
- Perl中删除或替换字符串中特殊字符(如空格)的方法
- Perl中删除或替换字符串中特殊字符(如空格)的方法
- 【字符串】字符串替换空格
- 去除字符串中的空格或替换某个字符
- Java_字符串的操作替换和删除空格
- 替换字符串中的空格
- 字符串替换空格
- 替换字符串中的空格
- 替换字符串中的空格
- 替换字符串中的空格
- 替换字符串中的空格
- 替换字符串中的空格
- 字符串中的替换空格
- 替换字符串中空格
- 替换字符串中的空格
- 字符串中的空格替换
- 字符串替换空格算法
- Kylin build cube step 2 报错(Kylin 安装在slave 节点上)
- 【杭电oj2028】Lowest Common Multiple Plus
- 英语学习——纤手香凝
- Android-自定义popupwindow详解(包含动画简单讲解)
- Java技术----多态的实现原理
- 字符串空格替换或删除
- 纯html、css3、js的时钟
- Q40:数组中只出现一次的数字
- Laravel队列的心得笔记
- 查看当前mysql使用频繁的sql语句
- Java 8系列之重新认识HashMap
- leetcode:295. Find Median from Data Stream
- Android错误之 java.lang.IllegalStateException: System services not available to Activities before onC
- 文件上传、压缩解压 操作