web-dev-qa-db-ja.com

Cで文字列をdouble変数に変換する

私は次のコードを書きました。.. "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の場合、ゼロを出力します...なぜこの曖昧な結果が得られますか?

12

sscanf(ヘッダーstdio.hまたはC++のcstdio):

char str[] = "12345.56";
double d;

sscanf(str, "%lf", &d);

printf("%lf", d);
23
Hauleth

しかし、常に0を出力します...しかし、retのタイプをintに変更すると...うまくいきます...タイプがfloatまたはdoubleの場合、ゼロを出力します。

ロジックは問題ありません。書式指定子だけが間違っています。 %fに変更してください。すべて順調です!

3
Pavan Manjunath

Doubleを返すatof()を使用できる場合があります。

ソース

2
jarchuleta

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);
1
Peter Clausen

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");
}
_
0
chux