私は次のコードを書きました。.. "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の場合、ゼロを出力します...なぜこの曖昧な結果が得られますか?
sscanf
(ヘッダーstdio.h
またはC++のcstdio
):
char str[] = "12345.56";
double d;
sscanf(str, "%lf", &d);
printf("%lf", d);
しかし、常に0を出力します...しかし、retのタイプをintに変更すると...うまくいきます...タイプがfloatまたはdoubleの場合、ゼロを出力します。
ロジックは問題ありません。書式指定子だけが間違っています。 %f
に変更してください。すべて順調です!
Doubleを返すatof()を使用できる場合があります。
Char *を2倍に解析する場合は、関数 "atof"を使用する必要があります。
また、区切り文字「%f」を使用してdoubleを印刷する必要があります。
詳細な情報と使用例は 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);
cで文字列をdouble変数に変換する
オーバーフローが問題にならない場合でも、コードは数値テキストの後に余分な非空白テキストを検出したい:
_// 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");
}
_