我编写了以下代码....它应该将类似“88”的字符串转换为double值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 ...它工作正常...当类型为float或double时,它打印为零...所以为什么我得到这个含糊不清结果
答案 0 :(得分:21)
在C ++中使用sscanf
(标题stdio.h
或cstdio
):
char str[] = "12345.56";
double d;
sscanf(str, "%lf", &d);
printf("%lf", d);
答案 1 :(得分:3)
但它始终打印0 ...但是当我将ret的类型更改为int ...时 工作正常......当类型为float或double时,它会打印为零。
逻辑很好。只是你的格式说明符是错误的。将其更改为%f
,一切顺利!
答案 2 :(得分:2)
您可以使用atof()它返回一个double。
答案 3 :(得分:1)
如果要将char *解析为double,则应使用函数“atof”。
您还应该使用分隔符“%f”来打印双精度词:
可以找到更多信息和使用示例here.
使用示例:
#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);
}
要打印它,您必须将其打印为浮动:
printf("This is the value in float: %f\n", yourFloatValue);
答案 4 :(得分:0)
将字符串转换为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");
}
答案 5 :(得分:0)
这对我有用:
double stod(const char* s); //declaration
double d = stod(row[0]); //call
double stod(const char* s){ //definition
double rez = 0, fact = 1;
if (*s == '-'){
s++;
fact = -1;
};
for (int point_seen = 0; *s; s++){
if (*s == '.'){
point_seen = 1;
continue;
};
int d = *s - '0';
if (d >= 0 && d <= 9){
if (point_seen) fact /= 10.0f;
rez = rez * 10.0f + (float)d;
};
};
return rez * fact;
};
答案 6 :(得分:-1)
#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));
}
}
答案 7 :(得分:-2)
以下代码适用于我。
#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);
}