将 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 将被定义为charwchar_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 数组转换为张量(不支持的对象类型浮点数)

将浮点数转换为PHP中的字节数组

如何在java中将4字节数组转换为浮点数

使用 iPhone 的 SIMD 浮点单元将浮点数转换为整数

将 CString 转换为浮点数

将 32 位浮点数转换为 16 位 PCM 范围