我正在嘗試從 MFC 中的編輯控制元件框中讀取 cstring,然后將其放入結構中的 char 陣列中,但是由于我無法執行諸如clientPacket->path = convertfuntion(a); 之類的操作。我必須創建另一個 char 陣列來存盤字串,然后逐個元素地存盤它。
這感覺像是一個強盜解決方案,有沒有更好的方法來解決這個問題?我想學習如何清理代碼。
CString stri;//Read text from edit control box and convert it to std::string
GetDlgItem(IDC_EDIT1)->GetWindowText(stri);
string a;
a = CT2A(stri);
char holder[256];
strcpy_s(holder,a.c_str());
int size = sizeof(holder);
struct packet {
char caseRadio;
char path[256];
};
packet* clientPacket = new packet;
for (int t = 0; t < size; t ) {
clientPacket->path[t] = holder[t] ;
}
編輯:這是我目前使用的:
CString stri;//Read text from edit control box and convert it to std::string
GetDlgItem(IDC_EDIT1)->GetWindowText(stri);
string a = CT2A(stri);
struct packet {
char caseRadio;
char path[CONSTANT];//#define CONSTANT 256
};
packet* clientPacket = new packet;
a = a.substr(0, sizeof(clientPacket->path) - 1);
strcpy_s(clientPacket->path, a.c_str());
我遇到了一個問題,我得到“1path”而不是“path”,結果它在 caseRadio='1' 中讀取,通過首先在服務器中讀取 caseRadio 來修復它
uj5u.com熱心網友回復:
使用 Windows API 呼叫時,您可以直接復制到用戶提供的緩沖區GetWindowTextA。以下說明了如何執行此操作:
struct packet {
char caseRadio;
char path[512];
} p;
::GetWindowTextA(GetDlgItem(IDC_EDIT1)->GetSafeHwnd(), &p.path[0],
static_cast<int>(sizeof(p.path)));
這使用CP_ACP代碼頁進行隱式字符編碼轉換。這通常是不可取的,您可能希望使用已知的字符編碼(例如CP_UTF8)執行轉換。
uj5u.com熱心網友回復:
我認為不需要創建中間“持有人”字符陣列。我想你可以直接做
strcpy(clientPacket->path, a.c_str());
您可能想要這樣做:
a= a.substr(0, sizeof(clientPacket->path)-1);
在 strcpy 之前避免緩沖區溢位,具體取決于編輯文本是否有大小限制。
uj5u.com熱心網友回復:
使用該CString.GetBuffer函式獲取指向字串的指標。在您的結構中,將路徑存盤為 achar*而不是 char 陣列。
struct packet {
char caseRadio;
char* path;
};
packet* clientPacket = new packet;
clientPacket->path = stri.GetBuffer();
uj5u.com熱心網友回復:
像這樣,也許?strncpy(clientPacket->path, CT2A(stri).c_str(), 255);. 此外,最好將 256 位元組設為常量并使用該名稱,以防萬一您在 10 年后更改此名稱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413490.html
標籤:
上一篇:【Groovy】Groovy 動態語言特性 ( Groovy 語言與 Java 語言執行效率對比 | 以動態特性編譯的 Groovy 類 | 以靜態特性編譯的 Groovy 類 )
