Arduino ESP8266 sscanf 可以处理 %lld 吗?
Can Arduino ESP8266 sscanf handle %lld?
我在使用 Arduino ESP8266 和 sscanf
函数时遇到问题。我正在尝试从我从串行端口收到的字符串中解析一个 64 位整数,如下所示:
int64_t temp_freq = 0;
sscanf(buffer, "FOUT = %lld Hz\r\n", &temp_freq);
编辑:我也试过`"FOUT = %" SCNd64 " Hz\r\n",结果相同
我知道我从串行端口得到了正确的字符串,因为我的代码检查我是否收到了特定类型的消息被触发并且是 运行。
我还可以确认 %lld 正在与 Serial.printf()
一起使用,所以我假设它也适用于 sscanf
。
但是,如果字符串中的值 > 2^31 - 1,我会将 2^31 - 1 写入我的 int64_t
变量。因此,例如 "FOUT = 18010000000 Hz\r\n"
在我的 int64_t
变量中给出 2,147,483,647。
我是在使用 sscanf
不正确,还是在平台上没有正确实施?
我同时使用以下方法作为解决方法:
int64_t temp_freq = 0;
char temp_buf[30] = {0x00};
sscanf(buffer, "FOUT = %s Hz\r\n", &temp_buf);
for (int i = 0; i < strlen(temp_buf); ++i) {
temp_freq *= 10;
temp_freq += temp_buf[i] - '0';
}
但我宁愿采用标准的工作方式和正确的方式,以免我不得不在任何地方维护我的手动解决方案。
PS:我标记为 C++ 和 C,因为它在技术上是 Arduino 上的 C++,但我编写的代码看起来更像 C 并使用 C 的 sscanf
而不是 stringstream
或 C++ 中的类似内容。
is it simply not implemented correctly on the platform?
您的工具链正在使用 newlib 作为 C 标准库实现,而且您很可能正在使用它的 nano 版本。 Newlib-nano 在 printf/scanf
系列函数中没有 long long
支持。
您可以:
- 使用完整的 newlib 版本而不是 nano 版本。在
gcc
编译器的情况下 不要 将 -specs=nano.specs
或 -lnano
传递给您的编译器选项。
- 使用不同的标准库或在启用选项的情况下重新编译 newlib。
- 自己重新实现所需的功能。
请注意,将 %lld
与 int64_t
一起使用在技术上可能是错误的 - 您应该使用 inttypes.h
中的 SCNd64
。
我在使用 Arduino ESP8266 和 sscanf
函数时遇到问题。我正在尝试从我从串行端口收到的字符串中解析一个 64 位整数,如下所示:
int64_t temp_freq = 0;
sscanf(buffer, "FOUT = %lld Hz\r\n", &temp_freq);
编辑:我也试过`"FOUT = %" SCNd64 " Hz\r\n",结果相同
我知道我从串行端口得到了正确的字符串,因为我的代码检查我是否收到了特定类型的消息被触发并且是 运行。
我还可以确认 %lld 正在与 Serial.printf()
一起使用,所以我假设它也适用于 sscanf
。
但是,如果字符串中的值 > 2^31 - 1,我会将 2^31 - 1 写入我的 int64_t
变量。因此,例如 "FOUT = 18010000000 Hz\r\n"
在我的 int64_t
变量中给出 2,147,483,647。
我是在使用 sscanf
不正确,还是在平台上没有正确实施?
我同时使用以下方法作为解决方法:
int64_t temp_freq = 0;
char temp_buf[30] = {0x00};
sscanf(buffer, "FOUT = %s Hz\r\n", &temp_buf);
for (int i = 0; i < strlen(temp_buf); ++i) {
temp_freq *= 10;
temp_freq += temp_buf[i] - '0';
}
但我宁愿采用标准的工作方式和正确的方式,以免我不得不在任何地方维护我的手动解决方案。
PS:我标记为 C++ 和 C,因为它在技术上是 Arduino 上的 C++,但我编写的代码看起来更像 C 并使用 C 的 sscanf
而不是 stringstream
或 C++ 中的类似内容。
is it simply not implemented correctly on the platform?
您的工具链正在使用 newlib 作为 C 标准库实现,而且您很可能正在使用它的 nano 版本。 Newlib-nano 在 printf/scanf
系列函数中没有 long long
支持。
您可以:
- 使用完整的 newlib 版本而不是 nano 版本。在
gcc
编译器的情况下 不要 将-specs=nano.specs
或-lnano
传递给您的编译器选项。 - 使用不同的标准库或在启用选项的情况下重新编译 newlib。
- 自己重新实现所需的功能。
请注意,将 %lld
与 int64_t
一起使用在技术上可能是错误的 - 您应该使用 inttypes.h
中的 SCNd64
。