在GetDlgItem()之后修剪CString

时间:2015-10-26 08:22:56

标签: c++ mfc trim c-strings

希望有人可以帮我解决这个问题!

我有一个对话框,其中包含一些填充了数据的组合框,用户应填写这些数据框,然后单击“保存”。单击“保存”时,程序将创建一个包含所选数据的outfile。

我的问题是我需要在保存文件前修剪连字符的所有内容!

组合框中填充了如下所示的字符串:

  • 4010-首先
  • 4020-二

我想在修剪后看起来像这样:

  • 4010
  • 4020

  • PH-Peter Hansen
  • JK-John King

我想在修剪后看起来像这样:

  • PH
  • JK

我使用Visual Studio 6.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);

}

提前致谢!

------------------------------------ UPDATE ------- ------------------------------

好的,经过一番混乱后,我终于找到了一个对我有用的解决方案..

以下是我们在你给我的建议后试图做的事情:

ComboBox的数据:

“4010-基”

我的代码:

pWnd = GetDlgItem(IDC_GROUP);
pWnd->GetWindowText(group);

int i = group.Find("-");

if (i >= 0)
{
group = group.Mid(0, i);

}

MessageBox(group); // results = 4010-group

它不起作用。

我想也许有一些与UNICODE相关的问题,所以我将ComboBox中的数据从“4010-group”更改为“4010 group”并尝试了这个:

pWnd = GetDlgItem(IDC_GROUP);
pWnd->GetWindowText(group);

int i = group.Find(" ");

if (i >= 0)
{
group = group.Mid(0, i);

}

MessageBox(group); // results = 4010

有效!但我不明白为什么连字符不起作用,有没有人有线索?

3 个答案:

答案 0 :(得分:3)

您可以使用CString::FindCString::Mid,其类似于wstring::findwstring::substr

另见CString functions

CString s = L"4010-First";

int i = s.Find('-');
if (i >= 0)
{
    s = s.Mid(0, i);
    TRACE(L"%s\n", s); //output: "4010"
}

或获得第一和第二部分:

CString s1 = s.Mid(0, i);
CString s2 = s.Mid(i + 1);
TRACE(L"(%s)(%s)\n", s1, s2); //output: (4010)(First)

答案 1 :(得分:2)

这是一个需要更少代码的问题解决方案。使用少量使用且有些误解的CString方法SpanExcluding,您可以用更少的行完成任务。

CString str = L"PH-Peter Hansen";
CString newStr = str.SpanExcluding(L"-");

只会返回“PH”。

答案 2 :(得分:2)

Re:&#34;我不明白为什么连字符不起作用,有没有人有线索?&#34;

有许多符号看起来像连字符但不是:dash, en-dash, em-dash, etc.您需要找出哪一个用作源中的分隔符。