无冗余字符串的拼接--2015

本文详细介绍了一种不使用数组而使用malloc和realloc进行字符串拼接的方法,同时演示了如何提取并排序奇数和偶数下标组成的子串。通过C语言实现,展示了内存动态分配、字符串处理和排序算法的应用。

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

无冗余的输入两个字符串,并对其进行拼接

1)输出拼接后的字符串。例如,string buff stringbuff

2)对于拼接后的字符串,输出奇数下标组成的子串和偶数下标组成的子串。 例如,srnbf tiguf

3)对于奇数下标组成的子串以及偶数下标组成的子串进行排序。例如 bfnrs fgitu

思考:
1.无冗余!不能用数组,要用mallo,realloc 开辟空间
2.字符串的拼接注意字符串的结构,最后一个字符是 ‘\0’
3.字符串指针计算时,下标管理
3.排序时,可另开辟两个字符串指针存储奇子串与偶子串,再进行冒泡排序,可直接通过比较单字符的ASCII码值来排序
代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
void Sort(char *ch){
    int len=strlen(ch);
    for(int i=0;i<len;i++){
        for(int j=i+1;j<len;j++){
            if(*(ch+i)>*(ch+j)){
                char temp=*(ch+i);
                *(ch+i)=*(ch+j);
                *(ch+j)=temp;
            }
        }
    }
    cout<<ch<<endl;
}


int main(){
    char *p=(char*)malloc(sizeof(char));
    char *q=(char*)malloc(sizeof(char));
    char ch;
    int i=1,j=1;
    while((ch=getchar())!=' '){//当输入不是空格时,开辟空间存储输入字符
            p=(char*)realloc(p,sizeof(char)*i);//已经开辟了i个空间
            *(p+i-1)=ch;
            i++;//指针前移

    }
    p=(char*)realloc(p,sizeof(char)*i);
    *(p+i-1)='\0';//存储最后的字符



    while((ch=getchar())!='\n'){
            q=(char*)realloc(q,sizeof(char)*j);
            *(q+j-1)=ch;
            j++;

    }
    q=(char*)realloc(q,sizeof(char)*j);
    *(q+j-1)='\0';


    p=(char*)realloc(p,sizeof(char)*(i+j-1));//先开辟足够的空间
    for(int k=0;k<j;k++){
        *(p+i+k-1)=*(q+k);//掩盖掉q本身的转义字符‘\0’
    }
    cout<<p<<endl;


    char *ch1=(char*)malloc(sizeof(char));//用来存储偶字符串
    char *ch2=(char*)malloc(sizeof(char));//用来存储奇字符串
    int t1=1,t2=1;
    for(int k=0;k<i+j-1;k++){
        if(k%2==0)
        {
        cout<<*(p+k);
        ch1=(char*)realloc(ch1,sizeof(char)*t1);
        *(ch1+t1-1)=*(p+k);
        t1++;
        }

    }
    *(ch1+t1)='\0';
    cout<<endl;

    for(int k=0;k<i+j-1;k++){
        if(k%2!=0) {
        cout<<*(p+k);
        ch2=(char*)realloc(ch2,sizeof(char)*t2);
        *(ch2+t2-1)=*(p+k);
        t2++;
        }

    }
    *(ch2+t2)='\0';
    cout<<endl;

    Sort(ch1);
    Sort(ch2);

    return 0;
}

<think>好的,用户现在需要优化代码中update分支的字符串拼接,避免末尾冗余逗号。首先,我需要回顾原代码中的update部分。原来的代码在update分支里,逐个检查字段是否变更,如果有变更就append一个带逗号的字符串,最后再append最新的备注。这样会导致如果有多个变更项,每个后面都加逗号,最后可能会有多余的逗号。 比如,如果数量和编码都变更,那么拼接后的字符串会是“数量由10变20,编码由A变B,新备注”,这里的逗号在“B”后面,导致“B”和“新备注”之间有一个多余的逗号。用户希望避免这种情况。 首先,我需要考虑如何处理这些变更项的拼接。常见的方法是使用StringJoiner,它可以自动处理分隔符,并且在没有元素时不会添加分隔符。或者,可以先收集所有变更项到一个列表中,然后用逗号连接,最后再加上备注。 另外,原来的代码在append完所有变更项后,直接append备注,这会导致变更项的最后一个逗号保留。所以需要将变更项拼接成一个没有末尾逗号的字符串,再加上备注。 具体步骤可能是这样的: 1. 在update分支中,创建一个集合(如List<String>)来保存所有变更的描述,比如“数量由X变更为Y”这样的字符串。 2. 逐个检查字段(数量、编码、描述、备注)是否有变更,如果有,就将对应的变更描述添加到集合中。 3. 使用String.join(",", 变更列表)将这些变更项用逗号连接,这样就不会有末尾的逗号。 4. 如果变更列表不为空,将拼接后的字符串加上逗号(或者直接拼接备注,视情况而定),然后再加上最新的备注。 5. 如果变更列表为空,直接添加备注。 例如,如果有变更项,拼接后的变更部分是“数量由10变20,编码由A变B”,然后加上备注“新备注”,结果就是“数量由10变20,编码由A变B新备注”?不对,应该中间用逗号分隔变更项和备注吗?需要看业务需求。原代码中是在变更项后加逗号,然后append备注,所以可能需要在变更项和备注之间加逗号,但如果变更项不存在,则不加。 或者,可能用户希望变更项之间用逗号分隔,最后一个变更项后面不加逗号,然后接备注,可能用逗号或直接连接。需要根据原逻辑判断。原代码中,变更项每个后面都加逗号,然后append备注,所以如果有变更项,会是“变更1,变更2,备注”,这里的问题是“变更2”后面的逗号多余,应该变成“变更1,变更2,备注”。 所以正确的做法是将所有变更项用逗号连接,形成一个无末尾逗号的字符串,然后如果有变更项,添加一个逗号,再添加备注;如果没有变更项,直接添加备注。 例如: 变更列表非空:“变更1,变更2,备注” 变更列表为空:“备注” 这样处理的话,就需要先拼接变更项,然后判断是否有变更项,再决定是否加逗号。 具体实现可以用StringJoiner或者收集到列表中再处理。 现在,我需要将这个逻辑应用到代码中。原来的代码在update分支中是这样的: if(part != null){ if(!String.valueOf(part.getQty()).equals(dm.getQty())){ contentBuilder.append("数量由" + dm.getQty() + "变更为" + part.getQty() + ","); } if(!String.valueOf(part.getItemCode()).equals(dm.getPartNo())){ contentBuilder.append("编码由" + dm.getPartNo() + "变更为" + part.getItemCode() + ","); } if(!String.valueOf(part.getItemDesc()).equals(dm.getPartDesc())){ contentBuilder.append("描述由" + dm.getPartDesc() + "变更为" + part.getItemDesc() + ","); } if(!String.valueOf(part.getRemark()).equals(dm.getRemark())){ contentBuilder.append("备注由" + dm.getRemark() + "变更为" + part.getRemark()+ ","); } } contentBuilder.append(part != null ? part.getRemark() : "该零件已取消"); 这里的问题是每个变更项后面都加了逗号,导致最后有多余的逗号。优化方法是将这些变更项收集起来,用逗号连接,然后处理末尾的逗号。 修改后的代码可以这样: 在update分支中,当part不为null时: List<String> changeList = new ArrayList<>(); if (!String.valueOf(part.getQty()).equals(dm.getQty())) { changeList.add("数量由" + dm.getQty() + "变更为" + part.getQty()); } if (!String.valueOf(part.getItemCode()).equals(dm.getPartNo())) { changeList.add("编码由" + dm.getPartNo() + "变更为" + part.getItemCode()); } if (!String.valueOf(part.getItemDesc()).equals(dm.getPartDesc())) { changeList.add("描述由" + dm.getPartDesc() + "变更为" + part.getItemDesc()); } if (!String.valueOf(part.getRemark()).equals(dm.getRemark())) { changeList.add("备注由" + dm.getRemark() + "变更为" + part.getRemark()); } // 拼接变更项 if (!changeList.isEmpty()) { contentBuilder.append(String.join(",", changeList)).append(","); } // 追加最新备注 contentBuilder.append(part.getRemark()); 这样,如果有多个变更项,会用逗号连接,比如“数量由10变20,编码由A变B”,然后加上逗号,再加上备注。但这样可能还是会有逗号,比如“数量由10变20,编码由A变B,新备注”。这时候是否需要逗号?原代码的意图可能是变更项和备注之间用逗号分隔,但如果变更项存在,那么需要逗号;如果不存在,则直接备注。 或者,可能原代码中的备注是独立的,应该直接拼接在变更项后面,不需要逗号。这时候如果变更项存在,应该用逗号分隔,否则直接拼接。 例如,如果变更项是“数量由10变20,编码由A变B”,备注是“新备注”,那么最终应该是“数量由10变20,编码由A变B,新备注”(中间用逗号)。或者可能不需要逗号,直接连接。需要看业务需求。 但原代码中,变更项每个后面都加逗号,然后append备注,所以原逻辑可能希望变更项和备注之间有逗号。但因为每个变更项后面都加了逗号,导致最后一个变更项后面有逗号,再加上备注,就会变成“变更1,变更2,备注”,这里的“变更2,”后面的逗号是多余的。 所以正确的做法是,将所有变更项用逗号连接(无末尾逗号),然后如果有变更项,添加一个逗号,再添加备注;否则直接添加备注。 例如: 变更项列表非空:“变更1,变更2,备注” 变更项列表为空:“备注” 这样处理的话,代码可以调整为: if (!changeList.isEmpty()) { contentBuilder.append(String.join(",", changeList)).append(","); } contentBuilder.append(part.getRemark()); 但这样如果变更项存在,会在变更项后加逗号,然后接备注,导致“变更1,变更2,备注”,这里的逗号可能还是多余的。比如,用户可能希望“变更1,变更2,备注”(用中文逗号),或者不需要逗号。这时候需要明确业务需求。 另一种可能是,变更项和备注之间不需要逗号,直接拼接。例如,“变更1,变更2新备注”,但这样可能不清晰。所以更好的方式是,变更项和备注之间用逗号分隔,但变更项内部用逗号分隔,且无末尾逗号。 例如,使用StringJoiner,设置分隔符为",",然后添加变更项,最后添加备注时判断是否需要逗号。 或者,将变更项拼接字符串,然后如果有变更项,添加“,”和备注;否则直接添加备注。 例如: String changes = String.join(",", changeList); if (!changes.isEmpty()) { contentBuilder.append(changes).append(","); } contentBuilder.append(part.getRemark()); 这样,变更项之间用逗号分隔,变更项和备注之间用中文逗号分隔,避免英文逗号可能带来的问题,同时确保没有末尾冗余逗号。 不过这可能取决于具体的业务需求和字符串格式要求。但核心是避免变更项末尾的冗余逗号。 总结,优化的关键点是将每个变更项收集到列表中,用逗号连接成无末尾逗号的字符串,然后再处理与备注的拼接,避免多余的逗号。 </think>要优化`update`分支的字符串拼接以避免末尾冗余逗号,核心思路是**先收集所有变更项,再统一拼接**,避免逐个`append`时手动添加逗号。以下是具体实现方案及代码示例: ### 优化方案 1. **收集变更项**:使用`List<String>`存储所有变更描述(如“数量由X变更为Y”),避免直接拼接逗号。 2. **统一拼接变更项**:通过`String.join(",", 变更列表)`将变更项用逗号连接(自动无末尾逗号)。 3. **处理变更项与备注的拼接**:若存在变更项,在变更字符串后添加逗号(或其他分隔符),再拼接最新备注;若无变更项,直接拼接备注。 ### 优化后代码(update分支部分) ```java // 修改操作处理(优化后) if ("update".equals(dm.getType())) { if (part != null) { // 收集所有变更项到列表(无冗余逗号) List<String> changeList = new ArrayList<>(); if (!String.valueOf(part.getQty()).equals(dm.getQty())) { changeList.add("数量由" + dm.getQty() + "变更为" + part.getQty()); } if (!String.valueOf(part.getItemCode()).equals(dm.getPartNo())) { changeList.add("编码由" + dm.getPartNo() + "变更为" + part.getItemCode()); } if (!String.valueOf(part.getItemDesc()).equals(dm.getPartDesc())) { changeList.add("描述由" + dm.getPartDesc() + "变更为" + part.getItemDesc()); } if (!String.valueOf(part.getRemark()).equals(dm.getRemark())) { changeList.add("备注由" + dm.getRemark() + "变更为" + part.getRemark()); } // 拼接变更项(无末尾逗号) if (!changeList.isEmpty()) { contentBuilder.append(String.join(",", changeList)).append(","); // 变更项与备注用逗号分隔 } } // 追加最新备注(若part为null则显示"该零件已取消") contentBuilder.append(part != null ? part.getRemark() : "该零件已取消"); } ``` ### 优化效果说明 - **避免冗余逗号**:通过`List`收集变更项,使用`String.join(",", 变更列表)`拼接,确保变更项内部仅用逗号分隔且无末尾冗余- **逻辑清晰**:变更项的收集与拼接分离,代码可读性提升。 - **灵活适配**:若后续需要调整分隔符(如改为中文逗号“,”),只需修改`String.join`的分隔符参数即可。 ### 极端场景验证 - **无变更项**:`changeList`为空,`contentBuilder`直接拼接备注(如`"新备注"`),无冗余逗号。 - **单个变更项**:`changeList`有1项(如`["数量由10变更为20"]`),拼接为`"数量由10变更为20,"`,再追加备注后结果为`"数量由10变更为20,新备注"`(若业务需要变更项与备注间无逗号,可删除`append(",")`)。 - **多个变更项**:`changeList`有多项(如`["数量由10变更为20", "编码由A变更为B"]`),拼接为`"数量由10变更为20,编码由A变更为B,"`,再追加备注后结果为`"数量由10变更为20,编码由A变更为B,新备注"`(若需避免变更项与备注间的逗号,可调整为`append(",")`或直接拼接)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值