在MFC

时间:2016-09-09 03:21:10

标签: c++ arrays mfc

由于我是C ++的新手,我被困在这2天了。我想使用这个函数从CString Array转换为Int Array但我不知道怎么做。有什么建议,在此先感谢!

以下是我的代码:

 void CCalculationBasicDlg::StringToIntegerArr(const CStringArray& arFields)
{
 int length = arFields.GetSize();
 int* arNum = new int[length];
 int tmp = 0; 
 for (int i = 0; i < length; i++)
 {
    tmp = _tstof(arFields[i]);
    arNum[i] = tmp;
 }
}

  // button to test function 
  void CCalculationBasicDlg::OnBnClickedBtnResult()
  { 
    UpdateData(TRUE);
    CString str_1, strDelimiters;
    CStringArray arFields1;

    edit_number_one.GetWindowText(str_1);
    m_ctrlDelimiters.GetWindowText(strDelimiters);

   // take String 1 and store in arFields1
   MyTokenizer(str_1, strDelimiters, arFields1);

   StringToIntegerArr(arFields1);
   // Can I put a breakpoint to test the integer array

   UpdateData(FALSE);
 }

2 个答案:

答案 0 :(得分:3)

转换只需调用std::stoi(或std::atoi,如果您不需要错误处理)。问题很复杂,因为CString存储ANSI(代码页)或Unicode编码字符。

由于std::stoistd::stringstd::wstring都有重载,因此可以通过让编译器从CString&#39;中构建适当的临时值来方便地处理。受控序列:

std::stoi(cstr.GetString());  // invokes either string::string(const char*) or
                              //                wstring::wstring(const wchar_t*)

然后可以将转换函数写为:

int* CCalculationBasicDlg::StringToIntegerArr(const CStringArray& arFields)
{
    int length = arFields.GetSize();
    int* arNum = new int[length];  // alternatively: std::vector<int> arNum(length);
    for (int i = 0; i < length; i++)
    {
        int value = std::stoi(arFields[i].GetString());
        arNum[i] = value;
    }
    return arNum;  // caller is responsible for clean-up
}


关于实施的一些注释:

  • 使用裸指针(int* arNum)无法满足异常安全的要求。 stoi以及(不可见的)string / wstring构造函数都可以抛出异常,从而使代码存在内存泄漏。请改用智能指针(例如std::unique_ptr)。
  • 更好的是,使用标准容器完全管理存储。
  • 使用移动语义可获得更好的性能。使用std::vector时,您不必特别做任何事情。只需返回本地对象,编译器将完成剩下的工作。
  • 由于代码可以抛出C ++异常(就像您的原始代码一样),因此请确保您了解规则。特别是,抛出和捕获异常之间的所有堆栈帧必须知道C ++异常。这通常不正确。一旦你被操作系统调用,所有的赌注都会关闭。

答案 1 :(得分:1)

首先,为什么使用CStringArray而不是std :: vector? 你知道你的阵列大小超过了程序吗?什么时候不用请使用矢量。创建数组是一项重大任务,因为您必须分配内存,因为它太经常使用时会产生性能问题。矢量没有这些问题,因为它具有灵活的分配内存大小。

要将CString转换为Int,请使用std :: atoi(CString)。我的解决方案如下所示:

CStringArray test;
int help[100];
for (int i = 0; i < test.GetSize(); i++) {
    help[i] = std::atoi(test.ElementAt(i));
}