在操作字符串的时候经常会碰到,一类是如何将字符串的部分替换,另一类就是如何将字符串进行重新组合。
一、如何将‘aaa@@@@bbbbbb@@@@@cccccccc@@@@@@dddddddddddd’,替换成‘aaa bbbbbb ccccccc dddddddddddd’
要求:时间复杂度O(1),空间复杂度O(1)
方法:
定义两个指针开始时候都指向字符开头,当另外一个走到需要去掉的字符时候将第一个字符替换成空格,如果之后还是需要替换的字符就将一个指针向后走,知道为不是需要替换的字符为止,然后在将指向需要替换的字符指向的位置替换成另外一个指针指向的字符就可以了。
代码:
void change(char* buf){
int i = 0;
int status = 0;
char* cur = buf;
char* next =buf;
if(NULL == buf)
return ;
while(*next != '\0'){
if(*next == '@'){
if(status == 0){
*(cur++) = ' ';
status = 1;
}
next++;
}
else{
status = 0;
*(cur++) = *(next++);
}
}
*cur = '\0';
}
二、如何将‘aaa@@@@bbbbbb@@@@@cccccccc@@@@@@dddddddddddd’,解析成‘aaa’,‘bbbbbb’,‘cccccccc’,‘ddddddddddddd’。
方法:定义有一个指针数组,将原数组的每一部分解析成指针数组的每一个元素。
代码:
#include<stdio.h>
void change(char* buf){
char* argv[5];
int argc = 0;
int status = 0;
int i = 0;
if(NULL == buf)
return;
while(buf[i] != '\0'){
if(status == 0 && buf[i] != '@'){
argv[argc++] = buf + i;
status = 1;
}
else if(buf[i] == '@'){
buf[i] = 0;
status = 0;
}
i++;
}
argv[argc] = NULL;
}