C++如何在数组特定字符前插入新字符串?

比如char s[1024]的内容为:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:BAIDUID=BAC35FD38184EDF93C0818766A9C1FAC:FG=1; BIDUPSID=BAC35FD38184EDF93C0818766A9C1FAC; PSTM=1508792546; __guid=43632054.3597110433861402000.1510060356476.66; monitor_count=4; Hm_lvt_55b574651fcae74b0a9f1cf9c8d7c93a=1510060358,1510061737,1510064805,1510064851; Hm_lpvt_55b574651fcae74b0a9f1cf9c8d7c93a=1510064851; pgv_pvi=9014017024; pgv_si=s8729621504; PSINO=7; H_PS_PSSID=; BDORZ=FFFB88E999055A3F8A630C64834BD6D0
Host:baike.baidu.com
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Upgrade-Insecure-Requests:1

我想在User-Agent:前插入“Rerferer:https://www.baidu.com/rn”这个字符串,使其变成:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:BAIDUID=BAC35FD38184EDF93C0818766A9C1FAC:FG=1; BIDUPSID=BAC35FD38184EDF93C0818766A9C1FAC; PSTM=1508792546; __guid=43632054.3597110433861402000.1510060356476.66; monitor_count=4; Hm_lvt_55b574651fcae74b0a9f1cf9c8d7c93a=1510060358,1510061737,1510064805,1510064851; Hm_lpvt_55b574651fcae74b0a9f1cf9c8d7c93a=1510064851; pgv_pvi=9014017024; pgv_si=s8729621504; PSINO=7; H_PS_PSSID=; BDORZ=FFFB88E999055A3F8A630C64834BD6D0
Host:baike.baidu.com
Rerferer:https://www.baidu.com/ //新插入了这个
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Upgrade-Insecure-Requests:1

请问具体应该怎么操作?谢谢

阅读 5.5k
3 个回答

字符插入数组指定位置:

/*
iPos:要插入的位置
*/
LPTSTR cfInsertString ( LPTSTR strDest, LPTSTR strInst, size_t iPos )
{
    // 判断字符串是否正常,不正常则直接返回
    if ( * strDest == '\0' || * strInst == '\0' )
    {
        return strDest;
    }
    // 计算2个字符串指针长度
    int iSrcLength = 0;
    int iInstLength = 0;
    while ( * strDest )
    {
        // 这里要先++,因为在下一个while中,判断的才是下个字符,而不是当前的,下同
        ++ strDest;
        iSrcLength ++;
    }
    while ( * strInst )
    {
        ++ strInst;
        iInstLength ++;
    }
    // 将字符串还原,因为上面在计数时,已经将字符指针指向字符串的尾部了
    strDest = strDest - iSrcLength;
    strInst = strInst - iInstLength;
    // for ( int i = 0; i < iSrcLength; i ++, pSrc -- );
    // for ( int i = 0; i < iInstLength; i ++, pInst -- );
    // 如果位置有误,也返回
    if ( (int)iPos<0 || (int)iPos>iSrcLength )
    {
        return strDest;
    }
    // 创建一个临时字符串指针用于存放结果,分配内存,大小为2个字符串之和
    LPTSTR pTemp = new TCHAR [ iSrcLength + iInstLength ];
    // 将被插入字符串的指定插入位置处前的字符内容先存入临时指针变量
    while ( iPos && ( * pTemp = * strDest ))
    {
        iPos --;
        pTemp ++;
        strDest ++;
    }
    // 再将插入的内容存入临时指针变量
    while ( * pTemp = * strInst )
    {
        pTemp ++;
        strInst ++;
    }
    // 最后将被插入字符串指针的剩下内容再接到临时指针变量中去
    while ( * pTemp = * strDest )
    {
        pTemp ++;
        strDest ++;
    }
    // 最后将临时指针变量指向开始部分,和被插入字符串指针也指向头
    pTemp = pTemp - iSrcLength - iInstLength;
    strDest = strDest - iSrcLength;
    // 将临时指针变量赋给被插入字符串指针,相当于strcpy
    while ( * strDest ++ = * pTemp ++ );
    // delete [] pTemp;
    // 使用系统API实现方式
    return strDest;
}

和这个没有本质区别吧,实际上就是:查找+替换.

 #include <iostream>
 #include <string>
 #include <algorithm>
 using namespace std;
 
 int main()
 {
     std::string ori("abc\ndef\n");
     std::cout<<ori<<std::endl;
 
     auto it = ori.find("def");
     ori.insert(it, "hello\n");
     std::cout<<ori<<std::endl;
 }

输出:

abc
def

abc
hello
def
  1. 看你的描述我猜测你是在写一个类似nginx的http服务代理或者窜改器,你想在特定的http请求中添加http头信息,不知道我对你要实现的功能理解是否正确。
  2. 如果是要做http请求修改的话,比较推荐的做法对http请求进行解析,解析到一个完整的http请求后再修改这个http请求,然后再转发给后端其他业务,如果只是在收包的时候判断关键字然后在关键字后添加你要加的头,这么处理是不完善的因为你的关键字可能分两次包被应用层接收,简单点说,你的关键字是"User-Agent",那么有可能第一次收包结尾是"User",第二次收包开头是"-Agent"。
  3. c语言的话推荐使用开源的http-parser库来做http请求解析,http-parser托管在GitHub上,传送门:https://github.com/arnoldlu/h...
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题