我写了下面的代码....应该转换一个字符串,如“88”,以双精度值88,并打印
void convertType(char* value)
{
int i = 0;
char ch;
double ret = 0;
while((ch = value[i] )!= '\0')
{
ret = ret*10 +(ch - '0');
++i;
}
printf("%d",ret);//or %f..what is the control string for double?
}
//input string :88
但它总是输出0 ...但是,当我修改RET的类型为int ...它工作正常...当类型为浮动或双,将打印零...所以为什么会出现这种不明确的结果?
使用sscanf
(标题stdio.h
或cstdio
在C ++):
char str[] = "12345.56";
double d;
sscanf(str, "%lf", &d);
printf("%lf", d);
但它总是输出0 ...但是,当我改变RET为int类型......它工作正常...当类型为float或double,它打印零。
逻辑是罚款。 只要您的格式说明是错误的。 将其更改为%f
,一切都很好!
您应该使用功能“ATOF”如果要分析一个char *将翻一番。
你也应该用分隔符“%F”打印双:
更多信息和使用示例,可以发现在这里。
使用示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
float val;
char str[20];
strcpy(str, "98993489");
val = atof(str);
printf("String value = %s, Float value = %f\n", str, val);
strcpy(str, "tutorialspoint.com");
val = atof(str);
printf("String value = %s, Float value = %f\n", str, val);
return(0);
}
要打印它,你必须打印为float:
printf("This is the value in float: %f\n", yourFloatValue);
转换的字符串在C双重可变
如果溢出是不是一个问题,但代码要在数字文本之后检测的额外非空白文本:
// return 1 on success
int convertType(const char* value, double *destination) {
char sentinel;
return sscanf(value,"%f %c", destination, &sentinel) == 1;
}
如果sscanf()
未能找到一个double
的,返回值sscanf()
将EOF
或0。
如果sscanf()
数字文本后发现非空白文本,它将返回2。
如果只有一个double
扫描,而无需额外的, sscanf()
返回1开头和结尾的白色空间是确定。
例:
double x;
if (convertType(some_string, &x)) {
printf("%.17e\n", x); // or whatever FP format you like
} else {
puts("Failed");
}
#define ZERO 48
#define NINE 57
#define MINUS 45
#define DECPNT 46
long strtolng_n(char* str, int n)
{
int sign = 1;
int place = 1;
long ret = 0;
int i;
for (i = n-1; i >= 0; i--, place *= 10)
{
int c = str[i];
switch (c)
{
case MINUS:
if (i == 0) sign = -1;
else return -1;
break;
default:
if (c >= ZERO && c <= NINE) ret += (c - ZERO) * place;
else return -1;
}
}
return sign * ret;
}
double _double_fraction(char* str, int n)
{
double place = 0.1;
double ret = 0.0;
int i;
for (i = 0; i < n; i++, place /= 10)
{
int c = str[i];
ret += (c - ZERO) * place;
}
return ret;
}
double strtodbl(char* str)
{
int n = 0;
int sign = 1;
int d = -1;
long ret = 0;
char* temp = str;
while (*temp != '\0')
{
switch (*temp)
{
case MINUS:
if (n == 0) sign = -1;
else return -1;
break;
case DECPNT:
if (d == -1) d = n;
else return -1;
break;
default:
if (*temp < ZERO && *temp > NINE) return -1;
}
n++;
temp++;
}
if (d == -1)
{
return (double)(strtolng_n(str, n));
}
else if (d == 0)
{
return _double_fraction((str+d+1), (n-d-1));
}
else if (sign == -1 && d == 1)
{
return (-1)*_double_fraction((str+d+1), (n-d-1));
}
else if (sign == -1)
{
ret = strtolng_n(str+1, d-1);
return (-1) * (ret + _double_fraction((str+d+1), (n-d-1)));
}
else
{
ret = strtolng_n(str, d);
return ret + _double_fraction((str+d+1), (n-d-1));
}
}
下面的代码对我的作品。
#include <stdio.h>
void convertType(char* value);
int main(int argc, char *argv[]) {
char *str="0929";
convertType(str);
return 0;
}
void convertType(char* value) {
double ret = 0;
while(*value != '\0') {
ret = ret*10 +(*value - '0');
value++;
}
fprintf(stdout, "value: %f\n", ret);
}