【其他】字符串的解析!!!

本文介绍两种字符串处理方法:一是去除特定字符并保持O(1)的时间和空间复杂度;二是将字符串按规则分割成多个子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在操作字符串的时候经常会碰到,一类是如何将字符串的部分替换,另一类就是如何将字符串进行重新组合。

一、如何将‘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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值