由于我是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);
}
答案 0 :(得分:3)
转换只需调用std::stoi
(或std::atoi
,如果您不需要错误处理)。问题很复杂,因为CString
存储ANSI(代码页)或Unicode编码字符。
由于std::stoi
对std::string
和std::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
时,您不必特别做任何事情。只需返回本地对象,编译器将完成剩下的工作。答案 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));
}