鍍金池/ 問(wèn)答/C  C++/ C++如何在數(shù)組特定字符前插入新字符串?

C++如何在數(shù)組特定字符前插入新字符串?

比如char s[1024]的內(nèi)容為:

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”這個(gè)字符串,使其變成:

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/ //新插入了這個(gè)
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

請(qǐng)問(wèn)具體應(yīng)該怎么操作?謝謝

回答
編輯回答
壞脾滊
  1. 看你的描述我猜測(cè)你是在寫一個(gè)類似nginx的http服務(wù)代理或者竄改器,你想在特定的http請(qǐng)求中添加http頭信息,不知道我對(duì)你要實(shí)現(xiàn)的功能理解是否正確。
  2. 如果是要做http請(qǐng)求修改的話,比較推薦的做法對(duì)http請(qǐng)求進(jìn)行解析,解析到一個(gè)完整的http請(qǐng)求后再修改這個(gè)http請(qǐng)求,然后再轉(zhuǎn)發(fā)給后端其他業(yè)務(wù),如果只是在收包的時(shí)候判斷關(guān)鍵字然后在關(guān)鍵字后添加你要加的頭,這么處理是不完善的因?yàn)槟愕年P(guān)鍵字可能分兩次包被應(yīng)用層接收,簡(jiǎn)單點(diǎn)說(shuō),你的關(guān)鍵字是"User-Agent",那么有可能第一次收包結(jié)尾是"User",第二次收包開(kāi)頭是"-Agent"。
  3. c語(yǔ)言的話推薦使用開(kāi)源的http-parser庫(kù)來(lái)做http請(qǐng)求解析,http-parser托管在GitHub上,傳送門:https://github.com/arnoldlu/h...。
2018年6月21日 05:29
編輯回答
骨殘心

和這個(gè)沒(méi)有本質(zhì)區(qū)別吧,實(shí)際上就是:查找+替換.

 #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
2017年5月25日 14:23
編輯回答
喵小咪

字符插入數(shù)組指定位置:

/*
iPos:要插入的位置
*/
LPTSTR cfInsertString ( LPTSTR strDest, LPTSTR strInst, size_t iPos )
{
    // 判斷字符串是否正常,不正常則直接返回
    if ( * strDest == '\0' || * strInst == '\0' )
    {
        return strDest;
    }
    // 計(jì)算2個(gè)字符串指針長(zhǎng)度
    int iSrcLength = 0;
    int iInstLength = 0;
    while ( * strDest )
    {
        // 這里要先++,因?yàn)樵谙乱粋€(gè)while中,判斷的才是下個(gè)字符,而不是當(dāng)前的,下同
        ++ strDest;
        iSrcLength ++;
    }
    while ( * strInst )
    {
        ++ strInst;
        iInstLength ++;
    }
    // 將字符串還原,因?yàn)樯厦嬖谟?jì)數(shù)時(shí),已經(jīng)將字符指針指向字符串的尾部了
    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;
    }
    // 創(chuàng)建一個(gè)臨時(shí)字符串指針用于存放結(jié)果,分配內(nèi)存,大小為2個(gè)字符串之和
    LPTSTR pTemp = new TCHAR [ iSrcLength + iInstLength ];
    // 將被插入字符串的指定插入位置處前的字符內(nèi)容先存入臨時(shí)指針變量
    while ( iPos && ( * pTemp = * strDest ))
    {
        iPos --;
        pTemp ++;
        strDest ++;
    }
    // 再將插入的內(nèi)容存入臨時(shí)指針變量
    while ( * pTemp = * strInst )
    {
        pTemp ++;
        strInst ++;
    }
    // 最后將被插入字符串指針的剩下內(nèi)容再接到臨時(shí)指針變量中去
    while ( * pTemp = * strDest )
    {
        pTemp ++;
        strDest ++;
    }
    // 最后將臨時(shí)指針變量指向開(kāi)始部分,和被插入字符串指針也指向頭
    pTemp = pTemp - iSrcLength - iInstLength;
    strDest = strDest - iSrcLength;
    // 將臨時(shí)指針變量賦給被插入字符串指針,相當(dāng)于strcpy
    while ( * strDest ++ = * pTemp ++ );
    // delete [] pTemp;
    // 使用系統(tǒng)API實(shí)現(xiàn)方式
    return strDest;
}
2018年1月9日 03:19