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
我使用VisualStudio6.0和MFC

以下是
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()