C++ 在GetDlgItem()之后修剪CString
希望有人能帮我解决这个问题 我有一个对话框,其中有几个组合框,其中填充了数据,用户应该填写这些数据,然后单击“保存”。单击“保存”时,程序将创建一个包含所选数据的输出文件 我的问题是,我需要在保存文件之前修剪连字符处的所有内容 组合框中填充的字符串如下所示:C++ 在GetDlgItem()之后修剪CString,c++,mfc,trim,c-strings,C++,Mfc,Trim,C Strings,希望有人能帮我解决这个问题 我有一个对话框,其中有几个组合框,其中填充了数据,用户应该填写这些数据,然后单击“保存”。单击“保存”时,程序将创建一个包含所选数据的输出文件 我的问题是,我需要在保存文件之前修剪连字符处的所有内容 组合框中填充的字符串如下所示: 4010第一 4020秒 我希望修剪后看起来像这样: 4010 4020 以及: 彼得·汉森博士 约翰·金 我希望修剪后看起来像这样: PH值 JK 我使用VisualStudio6.0和MFC 以下是OnOK代码: voi
- 4010第一
- 4020秒
- 4010
- 4020
- 彼得·汉森博士
- 约翰·金
- PH值
- JK
OnOK
代码:
void CExportChoices::OnOK()
{
CString sFileName, name, height, weight, age, haircolor, eyecolor, initials, group;
CWnd* pWnd = GetDlgItem(IDC_NAME);
pWnd->GetWindowText(name);
sFileName.Format(".\\Export\\%s_export%d.txt", name, GetTickCount());
ofstream outfile(sFileName,ios::out);
pWnd = GetDlgItem(IDC_HEIGHT);
pWnd->GetWindowText(height);
pWnd = GetDlgItem(IDC_WEIGHT);
pWnd->GetWindowText(weight);
pWnd = GetDlgItem(IDC_AGE);
pWnd->GetWindowText(age);
pWnd = GetDlgItem(IDC_HAIRCOLOR);
pWnd->GetWindowText(haircolor);
pWnd = GetDlgItem(IDC_EYECOLOR);
pWnd->GetWindowText(eyecolor);
pWnd = GetDlgItem(IDC_INITIALS);
pWnd->GetWindowText(initials);
pWnd = GetDlgItem(IDC_GROUP);
pWnd->GetWindowText(group);
outfile << "Height=" << height << "\n";
outfile << "\n";
outfile << "Weight=" << weight << "\n";
outfile << "\n";
outfile << "Age=" << age << "\n";
outfile << "\n";
outfile << "Hair color=" << haircolor << "\n";
outfile << "\n";
outfile << "Eye color=" << eyecolor << "\n";
outfile << "\n";
outfile << "Initials=" << initials << "\n";
outfile << "\n";
outfile << "Group=" << group << "\n";
outfile.close();
CDialog::EndDialog(22);
}
它不起作用
我认为可能存在与UNICODE相关的问题,因此我将组合框中的数据从“4010组”更改为“4010组”,并尝试了以下操作:
pWnd = GetDlgItem(IDC_GROUP);
pWnd->GetWindowText(group);
int i = group.Find(" ");
if (i >= 0)
{
group = group.Mid(0, i);
}
MessageBox(group); // results = 4010
它起作用了!但是我不明白为什么连字符不起作用,有人有线索吗?您可以使用
CString::Find
和CString::Mid
,这类似于wstring::Find
和wstring::substr
另见
或者获取第一部分和第二部分:
CString s1 = s.Mid(0, i);
CString s2 = s.Mid(i + 1);
TRACE(L"(%s)(%s)\n", s1, s2); //output: (4010)(First)
您可以使用
CString::Find
和CString::Mid
,这类似于wstring::Find
和wstring::substr
另见
或者获取第一部分和第二部分:
CString s1 = s.Mid(0, i);
CString s2 = s.Mid(i + 1);
TRACE(L"(%s)(%s)\n", s1, s2); //output: (4010)(First)
这里有一个解决问题的方法,它需要更少的代码。使用很少使用且被误解的CString方法,您可以用更少的行完成任务
CString str = L"PH-Peter Hansen";
CString newStr = str.SpanExcluding(L"-");
将导致只返回“PH”。这里有一个解决问题的方法,它需要更少的代码。使用很少使用且被误解的CString方法,您可以用更少的行完成任务
CString str = L"PH-Peter Hansen";
CString newStr = str.SpanExcluding(L"-");
将导致只返回“PH”。Re:“我不明白连字符为什么不起作用,有人有线索吗?”
有许多符号看起来像连字符,但实际上不是:您需要找出在源代码中哪个符号用作分隔符。Re:“我不明白连字符为什么不起作用,有人知道吗?”
有许多符号看起来像连字符,但实际上不是:您需要找出在源代码中用作分隔符的符号。您要查找的术语不是修剪,而是子字符串。为什么不使用CString::TrimRight方法?哦,好的!那我来看看子串!我试过:group.TrimRight('-');但这对我不起作用,我不确定。TrimRight一直为我工作。您能告诉我您是如何在这里使用它的吗?请不要使用
CDialog::EndDialog()
。而是使用默认的CDialog::OnOK()
实现来关闭对话框。还请使用MFC标准数据交换机制来替换丑陋的调用,如GetDlgItem()
您要查找的术语不是修剪,而是子字符串。为什么不使用CString::TrimRight方法?哦,好的!那我来看看子串!我试过:group.TrimRight('-');但这对我不起作用,我不确定。TrimRight一直为我工作。您能告诉我您是如何在这里使用它的吗?请不要使用CDialog::EndDialog()
。而是使用默认的CDialog::OnOK()
实现来关闭对话框。还请使用MFC标准数据交换机制来替换丑陋的调用,如GetDlgItem()