gpt4 book ai didi

c++ - 正确使用 _tcstod 并将 lpszEndChar 设置为 NULL 与否

转载 作者:行者123 更新时间:2023-12-01 14:48:00 28 4
gpt4 key购买 nike

我看到了答案 here并阅读了原始文档。

所以他们的代码:

bool IsValidFloat(const CString& text, double& value)
{
LPCTSTR ptr = (LPCTSTR) text;
LPTSTR endptr;
value = _tcstod(ptr, &endptr);
return (*ptr && endptr - ptr == text.GetLength());
}

我的一些用户遇到了一个问题,我想我已经将问题缩小到:
LPCTSTR lpszValue = (LPCTSTR)strWord ; 
LPTSTR lpszEndChar = NULL ;
double dLineSpace = _tcstod(lpszValue, &lpszEndChar);

我注意到在上面的示例中 endptr不默认为 NULL .也没有这个例子 here (他们只是使用 char *string, *stopstring; )。

这是我的代码失败的原因吗?我们不能默认 lpszEndChar 有什么具体原因吗?至 NULL ?

最佳答案

如果你给一个 strtod 函数系列(包括 _tcstod 在 Windows/MSVC 版本中)一个非 NULL 参数作为第二个参数,endptr参数(即有效指针变量的地址),那么当您调用该函数时,该指针具有的地址值(即使它是 NULL )并不(或不应该)重要:它是“仅输出”参数。如果您通过实际 NULL作为第二个参数,那么函数不会(不能)修改(不)指向的内容。

在您的情况下,您正在比较 *endptr - str (注意第一个的取消引用)与整个字符串的长度,以检查有效读取。这假设数字后面没有“额外”字符(甚至是空格)。

此测试失败的一个更可能的原因是在错误的语言环境中给出了浮点数;所以,如果你的语言环境被设置为默认的“C”(需要一个点小数点),并且一个数字被指定为“12,34”(欧洲格式),那么 12将从字符串中成功读取,但 *endptr将指向 3 .

要解决语言环境问题,有几个选项。首先(如果您知道“来源”语言环境),您可以使用 setlocale 调用前的函数 _tcstod设置适当的十进制字符:

setlocale(LC_NUMERIC, FRENCH_LOCALE);
double dLineSpace = _tcstod(lpszValue, &lpszEndChar);
setlocale(LC_NUMERIC, "C"); // Revert to default, 'C' locale

或者,如果您不确定小数是点还是逗号,您应该首先用点替换任何逗号。如果您的数据(最初)在 CString 中变量,而你只有一个数字,那么你可以使用 CString::Replace 功能:

myString.Replace(_T(','), _T('.'));
//...

但是,如果您的 CString比单个数字更复杂(或者不是 CString ),您将不得不编写一个小函数来为您进行替换。 (如果你需要的话,我也许可以提供一个提示!)

关于c++ - 正确使用 _tcstod 并将 lpszEndChar 设置为 NULL 与否,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61526450/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com