CString jobname;char* tempjobnm=T2A(jobname.GetBuffer(0));如果jobname变为string如何改写
时间: 2024-09-16 15:06:05 浏览: 65
如果你有一个`std::string`类型的变量`jobname`,而你想将其转换为C风格的`char*`指针,你可以使用`std::string`的`c_str()`成员函数。这里是相应的代码示例:
```cpp
std::string jobname;
char* tempjobnm = jobname.c_str(); // 将std::string转换为const char*
```
请注意,`c_str()`返回的是指向内部存储的常量字符数组的指针。如果你需要可修改的字符数组,可以先复制`jobname`的内容到一个新的动态分配的缓冲区:
```cpp
std::string jobname;
std::unique_ptr<char[]> tempjobnm(new char[jobname.size() + 1]); // 为可能的终止符'\0'预留空间
memcpy(tempjobnm.get(), jobname.c_str(), jobname.size());
tempjobnm[jobname.size()] = '\0'; // 添加终止符
```
这样,`tempjobnm`就是一个可以修改的`char*`。
相关问题
void CFindDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 m_Listbox.ResetContent(); //清空列表框的内容 CString name; //获取当前选中项 int index = m_comboName.GetCurSel(); //获取组合框当前内容 m_comboName.GetLBText(index, name); CInfoFile file; file.ReadDocline(); for (list<stu>::iterator it = file.ls.begin(); it != file.ls.end(); it++) { CStringA str; char* strname; str = name; //CString 转CStringA strname = str.GetBuffer();//CString 转为char * if (it->name == strname) { const char* szID = "学号:"; const char* szName = "姓名:"; const char* szAge = "年龄:"; const char* szGrade = "成绩:"; CString strID(szID), strName(szName), strAge(szAge), strGrade(szGrade); CString str; str.Format(_T("%d"), it->id); str = strID + str + _T("\r\n"); m_Listbox.AddString(str); str = CString(it->name.c_str()); str = strName + str + _T("\r\n"); m_Listbox.AddString(str); str.Format(_T("%d"), it->age); str = strAge + str + _T("\r\n"); m_Listbox.AddString(str); str.Format(_T("%d"), it->grade); str = strGrade + str + _T("\r\n"); m_Listbox.AddString(str); } } }为什么输出在列表框内的内容顺序是倒着的,先输出成绩最后输出学号
这段代码中,每次添加字符串到列表框中时,都是将新的字符串添加到了列表框的末尾。所以最终输出的顺序是按照添加的顺序倒序排列的,因为先添加的字符串会在后面。
如果希望按照一定的顺序输出字符串,可以将字符串先存储到一个数组或者列表中,然后再按照需要的顺序添加到列表框中。
比如,可以先定义一个存储字符串的列表:
```
std::vector<CString> strList;
```
然后在循环中将需要输出的字符串添加到列表中:
```
strList.push_back(strID + str + _T("\r\n"));
strList.push_back(strName + str + _T("\r\n"));
strList.push_back(strAge + str + _T("\r\n"));
strList.push_back(strGrade + str + _T("\r\n"));
```
最后将列表中的字符串按照需要的顺序添加到列表框中:
```
for (int i = 0; i < strList.size(); i++) {
m_Listbox.AddString(strList[i]);
}
```
这样就可以按照需要的顺序输出字符串了。
void CFindDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 m_Listbox.ResetContent(); //清空列表框的内容 CString name; //获取当前选中项 int index = m_comboName.GetCurSel(); //获取组合框当前内容 m_comboName.GetLBText(index, name); CInfoFile file; file.ReadDocline(); for (list<stu>::iterator it = file.ls.begin(); it != file.ls.end(); it++) { CStringA str; char* strname; str = name; //CString 转CStringA strname = str.GetBuffer();//CString 转为char * if (it->name == strname) { const char* szID = "学号:"; const char* szName = "姓名:"; const char* szAge = "年龄:"; const char* szGrade = "成绩:"; CString strID(szID), strName(szName), strAge(szAge), strGrade(szGrade); CString str; std::vector<CString> strList; str.Format(_T("%d"), it->id); strList.push_back(strID + str + _T("\r\n")); str = CString(it->name.c_str()); strList.push_back(strName + str + _T("\r\n")); str.Format(_T("%d"), it->age); strList.push_back(strAge + str + _T("\r\n")); str.Format(_T("%d"), it->grade); strList.push_back(strGrade + str + _T("\r\n")); for (int i = 0; i < strList.size(); i++) { m_Listbox.AddString(strList[i]); }}}}为什么输出在列表框的内容顺序倒过来了,第一个是成绩,最后一个是学号
这是因为在循环中添加字符串时,先将成绩的字符串添加到了列表框中,然后才是学号的字符串,导致了顺序倒过来。要解决这个问题,只需要将字符串的添加顺序改为先添加学号,再添加姓名、年龄和成绩即可。即将以下代码:
```
strList.push_back(strID + str + _T("\r\n"));
strList.push_back(strName + str + _T("\r\n"));
strList.push_back(strAge + str + _T("\r\n"));
strList.push_back(strGrade + str + _T("\r\n"));
```
改为:
```
strList.push_back(strGrade + str + _T("\r\n"));
strList.push_back(strAge + str + _T("\r\n"));
strList.push_back(strName + str + _T("\r\n"));
strList.push_back(strID + str + _T("\r\n"));
```
阅读全文