Tag: strtod

字符串长度有限的字符串

如果我想将char数组中的前3个字符解析为double,忽略以下字符,我真的需要这样做吗? int main(){ const char a [] =“1.23”; char * b = malloc(sizeof(char)* 4); memcpy(b,a,sizeof(char)* 3); b [3] =’\ 0′; printf(“%f \ n”,strtod(b,NULL)); //打印1.20000,这就是我想要的 自由(B); } 是不是像strtod这样的函数允许你指定它应该搜索数字的最大字符串长度? 编辑:我希望它打印1.2 (它目前做), 而不是 1.23 !

`strtod(“3ex”,&end)应该是什么结果? 怎么样`sscanf`?

在我的实验中这个表达 double d = strtod(“3ex”, &end); 用3.0初始化d并将end指针放在输入字符串中的’e’字符处。 这正如我所期望的那样。 ‘e’字符可能看起来是指数部分的开头,但由于缺少实际指数值(6.4.4.2要求),因此’e’应被视为完全独立的字符。 但是,当我这样做的时候 double d; char c; sscanf(“3ex”, “%lf%c”, &d, &c); 我注意到sscanf消耗%lf格式说明符的’3’和’e’ 。 变量d接收3.0值。 变量c以’x’结尾。 这看起来很奇怪有两个原因。 首先,由于语言规范在描述%f格式说明符的行为时引用了strtod ,我直观地期望%lf以与strtod相同的方式处理输入(即选择与终止点相同的位置)。 但是,我知道历史上scanf应该返回不超过一个字符回输入流。 这限制了任何超前scanf的距离可以由一个字符执行。 上面的例子需要至少两个字符前瞻。 所以,假设我接受%lf从输入流中消耗’3’和’e’的事实。 但后来我们遇到了第二个问题。 现在sscanf必须将”3e”转换为double类型。 “3e”不是浮点常数的有效表示(同样,根据6.4.4.2,指数值不是可选的)。 我希望sscanf将此输入视为错误:在%lf转换期间终止,返回0并保持d和c不变。 但是,上面的sscanf成功完成(返回2 )。 这种行为在标准库的GCC和MSVC实现之间是一致的。 所以,我的问题是,在C语言标准文档中它确实允许sscanf如上所述行为,参考上述两点:消耗比strtod更多的function并成功地将这样的序列转换为”3e” ? 通过查看我的实验结果,我可以“反向工程” sscanf的行为:消耗尽可能多的“看起来正确”从不退后,然后将消耗的序列传递给strtod 。 那种’e’被%lf消耗然后被strtod忽略的方式。 但究竟是语言规范中的所有内容吗?

将char *转换为float或double

我有一个从文件读入的值,并存储为char *。 值是货币编号,#。##,##。##或###。##。 我想将char *转换为我可以在计算中使用的数字,我尝试过atof和strtod,他们只是给我垃圾数字。 这样做的正确方法是什么,为什么我做错的方式呢? 这基本上就是我正在做的事情,只是从文件读入char *值。 当我打印出temp和ftemp变量时,它们只是垃圾,巨大的负数。 另一个编辑: 我在gcc中运行这个 #include int main() { char *test = “12.11”; double temp = strtod(test,NULL); float ftemp = atof(test); printf(“price: %f, %f”,temp,ftemp); return 0; } 我的输出是价格:3344336.000000,3344336.000000 编辑:这是我的代码 if(file != NULL) { char curLine [128]; while(fgets(curLine, sizeof curLine, file) != NULL) { tempVal = strtok(curLine,”|”); pairs[i].name= strdup(tempVal); tempVal […]