有没有更好的方法来修改结构中的 char 数组? C++
Is there a better way to modify a char array in a struct? C++
我正在尝试从 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 来修复它
我认为不需要创建中间 'holder' 字符数组。
我想你可以直接做
strcpy(clientPacket->path, a.c_str());
您可能想这样做:
a= a.substr(0, sizeof(clientPacket->path)-1);
在 strcpy 之前以避免缓冲区溢出,具体取决于编辑文本是否有大小限制。
使用CString.GetBuffer
函数获取指向字符串的指针。在您的结构中,将路径存储为 char*
而不是 char 数组。
struct packet {
char caseRadio;
char* path;
};
packet* clientPacket = new packet;
clientPacket->path = stri.GetBuffer();
像这样,也许吧? strncpy(clientPacket->path, CT2A(stri).c_str(), 255);
。
另外,最好将 256 字节设为常量并使用该名称,以防万一您在 10 年后更改它。
使用 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
)执行转换。
我正在尝试从 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 来修复它
我认为不需要创建中间 'holder' 字符数组。 我想你可以直接做
strcpy(clientPacket->path, a.c_str());
您可能想这样做:
a= a.substr(0, sizeof(clientPacket->path)-1);
在 strcpy 之前以避免缓冲区溢出,具体取决于编辑文本是否有大小限制。
使用CString.GetBuffer
函数获取指向字符串的指针。在您的结构中,将路径存储为 char*
而不是 char 数组。
struct packet {
char caseRadio;
char* path;
};
packet* clientPacket = new packet;
clientPacket->path = stri.GetBuffer();
像这样,也许吧? strncpy(clientPacket->path, CT2A(stri).c_str(), 255);
。
另外,最好将 256 字节设为常量并使用该名称,以防万一您在 10 年后更改它。
使用 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
)执行转换。