建了一個基于對話框的mfc,添加了兩個編輯框,在第一個編輯框中寫入abc\0abc,然后全選,在第二個對話框中粘貼后,結果仍然是abc\0abc;
但是如果我自己寫函式實作這個功能的話,把第一個框中的字串賦給第二個對話框時,結果成了abc,即把\0認成結束符,將字串截斷了!
想請教各位大神,系統的復制粘貼是怎么做到不丟\0后面的字串的?或者各位大神有什么好方法?(最近處理的資料中會出現\0,經常丟后面的資料,所以想到了系統的復制粘貼,想了解是怎么實作的!網上沒有找到合適的資料!)萬分感激!
uj5u.com熱心網友回復:
\表示字符的話用'\\' \單個的話表示轉意"\\0" 這樣就不會有問題
uj5u.com熱心網友回復:
也就是說我要先把要復制的字串處理一下,粘貼后再把字串用相反的方式處理?
uj5u.com熱心網友回復:
\ 表示轉意符 是在編譯階段完成的,
CString szSrc = _T("abc\\01234");
SetDlgItemText(IDC_EDIT1, szSrc);
CString szStr2;
GetDlgItemText(IDC_EDIT1, szStr2);
SetDlgItemText(IDC_EDIT2, szStr2);
uj5u.com熱心網友回復:
\表示字符的話用'\\' \單個的話表示轉意
"\\0" 這樣就不會有問題
\\在ascii編譯時看做整體,ascii碼為5c,這點我明白了,很感謝您!還想請教您一下!所復制的字串是隨便寫的,不會事先知道字串的長度和內容,那我應該用什么方法把這個字串中的\0改成\\0?(用字串函式替換處理的話,碰到\0就結束了,讀不完整;用字符一個一個處理的話又不知道所復制字串的長度,strlen得不到正確的長度,因為碰到\0時就認為結束了!)感謝您!
uj5u.com熱心網友回復:
\表示字符的話用'\\' \單個的話表示轉意
"\\0" 這樣就不會有問題
我是在做套接字時遇到的問題,服務器連續兩次執行send函式向客戶端發送資訊,而客戶端只執行一次recv,因為服務器發送的兩次資料中間會自動加上\0,導致客戶端recv到的資料只是服務器第一次send的,第二次send的資料丟了,查看記憶體發現兩次的資料都到了客戶端,所在想怎么能把兩次send的資料都recv到字串中,兩次資料的中間用空格或是換行等區分!
uj5u.com熱心網友回復:
'\0' 其實就是字串的結束符0所以可以把接收到的資料當成字串處理就行, 像MFC的CString 做+運算就可以了
uj5u.com熱心網友回復:
'\0' 其實就是字串的結束符0
所以可以把接收到的資料當成字串處理就行, 像MFC的CString 做+運算就可以了
服務器連續執行下面的兩個send函式
send(sockConn, sendtext1, strlen(sendtext1)+1 , 0);
//sendtext1為"abc"
send(sockConn, sendtext2, strlen(sendtext2)+1 , 0);
//sendtext2為"efg"
客戶端再執行一次recv函式,將接收的資料存到recvtext中,查看記憶體發現recvtext接收的資料為"abc\0efg\0",(資料是對的),但對這個資料應用時,比如把recvtext賦給其他變數時,得到的結果為"abc",就像您說的,recvtext認為自己只有"abc",遇到\0時就認為自己的字串已經結束了,但實際上后面還有"efg"呢,所以怎么把"efg"讀出來啊?
uj5u.com熱心網友回復:
strlen(sendtext2)+1 即 '\0' ; 改變分割符uj5u.com熱心網友回復:
//這里假設已經接收到了完整的資料,沒有考慮資料被截斷
char *pStr = (char*)pRecv; //指向接識訓沖區
int iTotalLen = 0; //總長度
CStringArray rcvStr; //接收陣列
while(iTotalLen < iRecvedLen)
{
rcvStr.Add(CString(pStr)); //添加到陣列
int iLen = (int)strlen(pStr) + 1; //字串長度+結束符
pStr += iLen; //移動到下一組資料起始位置
iTotalLen += iLen; //總處理的長度
}
uj5u.com熱心網友回復:
strlen(sendtext2)+1 即 '\0' ; 改變分割符
一會去試一下,謝謝您!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/50121.html
標籤:基礎類
