问题
I have written the following code....It should convert a string like "88" to double value 88 and print it
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
But it always prints 0...But when i change type of ret to int ...it works fine...when the type is float or double,it prints zero...so why am i getting this ambiguous results?
回答1:
Use sscanf
(header stdio.h
or cstdio
in C++):
char str[] = "12345.56";
double d;
sscanf(str, "%lf", &d);
printf("%lf", d);
回答2:
But it always prints 0...But when i change type of ret to int ...it works fine...when the type is float or double,it prints zero.
Logic is fine. Just your format specifier is wrong. Change it to %f
and all is well!
回答3:
You might be able to use atof() it returns a double.
source
回答4:
You should use function "atof" if you want to parse a char* to double.
You should also use the delimiter "%f" to print the double:
More information and example of use can be found here.
Example of use:
#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);
}
To print it you must print it as a float:
printf("This is the value in float: %f\n", yourFloatValue);
回答5:
converting string to a double variable in C
If overflow is not a concern, yet code wants to detect extra non-white-space text after the numeric text:
// return 1 on success
int convertType(const char* value, double *destination) {
char sentinel;
return sscanf(value,"%f %c", destination, &sentinel) == 1;
}
If the sscanf()
fails to find a double
, the return value of sscanf()
will
be EOF
or 0.
If the sscanf()
finds non-white-space text after numeric text, it will return 2.
If only a double
is scanned, without extra, sscanf()
returns 1. Leading and trailing white-spaces are OK.
Example:
double x;
if (convertType(some_string, &x)) {
printf("%.17e\n", x); // or whatever FP format you like
} else {
puts("Failed");
}
回答6:
The following code works for me.
#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);
}
回答7:
#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));
}
}
来源:https://stackoverflow.com/questions/10075294/converting-string-to-a-double-variable-in-c