字符串空格替换或删除
2016-08-14 23:01
253 查看
1.将一个字符串里面的空格替换成%20,不考虑字符数组大小溢出,不得使用库函数
2.将一个字符串里面的一个或多个空格替换成一个空格
这两道题都是关于字符串替换,不同的是第一道题是将一个空格替换为3个字符%20,当然这里任意3个字符都可以,而且只要保证数组大小足够大,一个空格替换成多个也无所谓,本质上是将一个字符替换成多个字符从而增加原字符的长度。
而第二个的话则是将多个字符(只不过是相同的)替换成一个字符,从而减小原字符串的长度。
对于第一道题,可以这么考虑,先遍历字符串求取原来的字符串长度oldLen和空格个数blankNum,由题可知每多一个空格字符串长度就增加(3-1)个即新字符串的长度newLen=oldLen+2*blankNum,最后将原来的字符串自后向前拷贝到新的空间,如图所示,以hi usa为例。
代码如下:
对于第二题,我自己是这么考虑的,还是遍历整个字符串,在遍历的过程中遇到非空格指针string++,遇到第一个空格的时候不管还是string++, 直到遇到第二个空格记下第二个空格的位置p=string,然后string指针继续走看是否还有连续的空格直到遇到非空格,此时string指针指向非空格的位置,然后将string及以后字符串拷贝到p以后位置,如图所示(即字符串is a man\0整体向前移动一位)。
那么为什么还要设置一个q指针来保存遇到第二个空格时候string的位置呢?
那是因为在拷贝的时候*p++=*string++指针p和string位置都变化了,需要有个q指针保存之前的位置从而string好定位,来继续执行循环。(移动完字符串如下图)
代码如下
C和指针书上给出另一种实现方式,设置两个指针src和dst,让src先走,执行src向dst的拷贝,遇到非空格直接拷贝,遇到空格看前面一个是否是空格,如果不是就拷贝否则就不操作。
代码如下
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--; } else str[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'; }
相关文章推荐
- Java_字符串的操作替换和删除空格
- SQLServer如何删除字段中的某个字符串,或者替换为空格?
- Perl中删除或替换字符串中特殊字符(如空格)的方法
- Perl中删除或替换字符串中特殊字符(如空格)的方法
- 删除字符串中的空格
- 【代码保留】Oracle删除字符串空格
- 替换字符串中连续空格为一个空格的方法(SQL)
- 删除字符串空格
- 字符串的一般性应用--替换,删除
- 将字符串中多个空格替换成一个空格
- 使用正则表达式将一个字符串中连续的多个(两个或者两个以上)替换为一个空格
- 删除字符串中的空格
- C# 删除字符串中任何位置的空格
- 如何删除EXCEL单元格中字符串首尾的空格
- 【代码保留】Oracle删除字符串空格
- 字符串操作——插入、替换、删除
- javascript中删除字符串空格的方法
- jQuery的$.trim函数可以删除字符串前后的换页、换行、制表、回车、空格、垂直制表等字符。
- 删除字符串中的空格
- 笔试题:删除字符串的空格并返回空格数目