- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我写了一个小代码,它将任何字符串(导出为环境变量)分成整数和小数部分。
例子: 导出 ENV_NUM=3.45
程序将打印: 整数:3 小数:0.45
此外,此程序还会扫描导出的号码是否超出范围或无效号码,在这种情况下,它会退出并打印错误消息。
为了简化读者的操作,让我解释一下我使用的逻辑: 我已经扫描了数字,并使用 strtok
在发现小数点 (.) 的地方将数字分成两部分,然后将第一个标记分配给整数部分,将下一个标记分配给小数部分。
面临的问题:现在这个程序的问题是:如果导出的数字是十六进制数或指数数,它会给出错误的结果。
你能告诉我问题是什么吗?
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <errno.h>
#include <string.h>
static time_t wholeNumber;
static float fractional;
void numberParser(void);
int main(int argc, char **argv)
{
numberParser( );
printf("Whole number: %12d, Fractional: %5.8f\n", wholeNumber, fractional);
return 0;
}
void numberParser( void )
{
char * charPtr, * numberFormatErr;
charPtr = getenv("ENV_NUM");
if ( charPtr == NULL )
return;
double envVal = strtod(charPtr, &numberFormatErr);
/* This part checks if the string is a valid number and not negative */
if ( (numberFormatErr == charPtr) || (*numberFormatErr != '\0') ) {
printf("exited: ENV_NUM is not a number\n");
exit(1);
}
else if ( envVal < 0 ) {
printf("exited: ENV_NUM a negative number\n");
exit(1);
}
/* This part breaks the string into integral and float part */
char * tokens = strtok(charPtr, ".");
int count = 0;
errno = 0;
while ( tokens != NULL ) {
//printf("Token scanned: %s\n",tokens);
long d = strtol(tokens, NULL, 10);
//printf("token to long: %5d\n",d);
if ( errno == ERANGE && d == LONG_MAX ) {
printf("exited: ENV_NUM not in valid range.");
exit(1);
}
if ( count == 0 ) {
( wholeNumber = d );
}
tokens = strtok(NULL, " ");
count++;
}
fractional = (envVal) - (double)(wholeNumber);
}
这是输出:
Correct output for normal numbers
[time_related]$ ./a.out
Whole number: 3, Fractional: 0.56000000
十六进制的错误输出: [time_related]$ export ENV_NUM=0x21
[time_related]$ ./a.out
Whole number: 0, Fractional: 33.00000000 (should be 33, 0)
指数的错误输出: [time_related]$ export ENV_NUM=3e3
[time_related]$ ./a.out
Whole number: 3, Fractional: 2997.00000000 (should be 3000, 0)
最佳答案
令我惊讶的是 strtod 解析十六进制数字,因为我查看了两个引用文献并且他们没有提到这种能力,但为什么不呢。
请注意,0x21 = 33,而不是 35。
你做了中间打印,使用它:对于 0x21,envVal 是 33,strtol 无法解析超出 x,所以它返回 0,小数是 envVal - 0 = 33
同上 3e3:它不是一个长数,所以 strtol 返回 3,小数部分是 3000-3
您应该像对 strtod 所做的那样对 strtol 的结果添加检查...
关于c - 数字解析器程序 : why strtol/strtod fails for exponential and hex numbers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7484776/
你好,我是 SMARTRF-05EB - 评估板的新手,我已经在 Linux 虚拟机中安装了 SDCC 和 Contiki-2.6。我能够构建此目录 contiki-2.6/contiki/examp
下面的简单代码会产生奇怪的输出: #include #include #include "/tmp/sha.h" #define DIGEST 64 //taken from coreutils
我不知道为什么 Hex 函数返回一个像 '0x41' 而不是 0x41 的字符串 我需要将 ASCII 值转换为十六进制。但我想要 0x INT 格式,而不是 '0x' 字符串。 ascii = 36
所以我试图从十六进制文件中读取,修改十六进制值,将新的十六进制值写入新文件。然后打开新文件,再次修改十六进制并重写到第三个文件。我正在对十六进制值进行非常简单的加密。 我用来阅读的函数是休闲的: ve
是否有一种惯用的方式将 Clojure 中的字符串编码和解码为十六进制?来自 Python 的示例: 'Clojure'.encode('hex') # ⇒ '436c6f6a757265' '436
下面的函数可以完美地将字符串转换为十六进制: function String2Hex(const Buffer: AnsiString): string; begin SetLength(Resu
我要做的是将 double 字符串转换为十六进制字符串,然后再转换回 double 。 以下代码将 double 字符串转换为十六进制字符串。 char * double2HexString(doub
我正在尝试将整数转换为十六进制。我找到了解决此问题的答案,例如 this ,尽管它们对我不起作用。我的意思是: 如果我拿这个: buf = "" buf += "\xda\xc7\xd9\x74\x
许多在线示例将哈希显示为十六进制表示,它们通常是自定义实现。改用 Apache Commons Base64 编码有什么问题或安全性降低吗?在阅读有关编码的内容时,通常是在如何将二进制表示为 XML
我需要存储这种类型的值 0xff0000或 0x00ff08 (十六进制颜色表示)在solidity智能合约中,并且能够在合约内将其转换为具有相同文本字符的字符串"ff0000" .我打算在 RSK
如果我有两种颜色: #ffcc00 和#334455 我如何获得这两种颜色之间的所有#hex 颜色,并逐渐排序? 最佳答案 你可以试试这个工具: http://www.colorhexa.com/ff
我的命令输出类似于 0x53 0x48 0x41 0x53 0x48 0x49。现在我需要将其存储在十六进制值中,然后将其转换为 ASCII 作为 SHASHI。 我试过的- 我尝试将十六进制值存储为
我正在使用计算 16 位 CRC 校验和的函数。 该函数生成一个包含校验和的 LONG(以 10 为基数的数字格式)。当然,这可以以十六进制等效形式打印到控制台,如下所示: printf("Check
我有一些以 INTEGER 形式提供给我的数字数据。我将它与其他数据一起插入到 SQLite 中,但当我将其写出时 INTEGER 数字需要为 8 位 Hex 数字,前导零。 例如 输入 400 80
在尝试附加数据对象转换为十六进制值后,我有如下代码,但它给了我以下错误: Unexpectedly found nil while unwrapping an Optional value let n
我有三个程序。程序A的代码如下: #include "stdafx.h" #include #include #include using namespace std; int _tmain(
我得到了这段代码,它从十六进制转换为 base64,反之亦然。我从另一个 SO 问题中得到了 to_base64,然后我通过一些猜测和反复试验编写了 to_hex。 class String de
我有一些关于控制建筑物访问的磁卡的信息,并且需要对软件在卡上存储数据的方式进行逆向工程,以制作具有更多功能的东西。 (我们已经和原来的程序员失去了联系。) 我不知道如何编写订单;我不是磁卡专家。 我知
我想在我拥有的 HEX 文件中找到模式并按出现次数对它们进行排序。 我不是在寻找某种特定的模式,只是为了对那里发生的事件进行一些统计并对其进行排序。 DB0DDAEEDAF7DAF5DB1FDB1DD
我在出示卡片时从 RFID 阅读器接收字节,但我无法弄清楚如何从这些字节中获取卡 ID。 例如,我有一张卡片,上面印有这些数字: 0007625328 116,23152 .我希望这是那张卡的 ID,
我是一名优秀的程序员,十分优秀!