将 CString 转换为浮点数组
Posted
技术标签:
【中文标题】将 CString 转换为浮点数组【英文标题】:Convert a CString to an array of floats 【发布时间】:2016-10-24 12:53:21 【问题描述】:我目前正在使用 MFC 构建一个特定的程序,该程序要求用户输入一系列数字,如下面在 CString
中突出显示的那样(为简单起见,我们将其称为 aCString)。
我可以使用“strtok”将字符串或字符数组转换为浮点数组 没有问题。
但我正在努力将CString
转换为字符串或字符数组,以便进行前面提到的转换!
-我试过strcpy
strcpy(my_string, (LPCTSTR)aCString);
但是遇到了这个错误
char *strcpy(char *,const char *)': 无法将参数 2 从 'LPCTSTR' 到 'const char *'
感谢您的帮助!
【问题讨论】:
相当于strtok()
(虽然不是破坏性的)是CString::Tokenize()。
由于国际化,CString
没有使用普通的char
作为字符,而是TCHAR
将被定义为char
或wchar_t
,具体取决于您的UNICODE
宏项目设置。
【参考方案1】:
CString 类模板提供了Tokenize 成员,可用于将输入字符串拆分为单独的标记。然后可以使用std::stof 函数将标记转换为浮点值:
std::vector<float> ToFloats( const CString& numbers )
std::vector<float> buffer;
int start 0 ;
CString token = numbers.Tokenize( _T( "," ), start );
while ( start != -1 )
buffer.push_back( std::stof( token.GetString(),
static_cast<size_t>( token.GetLength() ) ) );
token = numbers.Tokenize( _T( "," ), start );
return buffer;
【讨论】:
不要忘记std::stof
的异常处理
@BarmakShemirani:你挑出std::stof
很奇怪。 std::vector::push_back
可以扔,CStringT::Tokenize
也可以。但这不是重点:在这个函数中处理异常的适当方法是根本不做任何事情。此函数无法知道转换输入或构造输出的失败是可容忍的还是致命的。需要处理异常的是调用者,因为只有调用者知道。
@BarmakShemirani:这个函数承诺返回一个浮点向量。如果它不能满足这个承诺,它就会抛出一个异常。调用链上的任何调用者都可以决定它是否可以合理地处理异常。这个功能不能。此外,未捕获的异常不会“崩溃”。他们调用unexpected
处理程序,默认情况下调用terminate
。这是一个干净且确定性的关闭。
感谢 IInspectable,我在不同的部分看到了您的评论,我必须进一步阅读。只需为std::stof
添加try
/catch(...)
即可解决此问题。如果用户不小心按错了键,我不想关闭程序!
@BarmakShemirani:这是错误的解决方案。它只是隐藏错误。您可能不希望您的程序因无效输入而终止,但您肯定不希望您的程序使用无效输入,甚至不知道它。如果您需要继续运行,请在调用链的更高位置捕获异常。此函数不能(并且不得)隐藏错误。这是有原因的。以上是关于将 CString 转换为浮点数组的主要内容,如果未能解决你的问题,请参考以下文章
无法将 NumPy 数组转换为张量(不支持的对象类型浮点数)