2016-12-15 4 views
-1

strtok1,2,1.0を使用して文字列から小数点以下の数字を抽出しました。c文字列を先行ゼロを持つ可能性のある小数点以下の数字に変換する正しい方法

UPDATE この場合のフォーマットは0.0 up to 1.0から制限されます。したがって、小数点以下は小文字の&です。 printfはユーザーのフィードバック&の確認用です。番号はnumber formatn.nを要求するライブラリに渡されます。 Perhapse私はメッセージを誤解しているので、cプログラムは数字が1未満の場合にのみ.nを得る。

これで、第3の数値をn.n形式のintに変換する必要があります。この形式では、1より小さい場合は先頭にゼロが必要です。

私はint, float, doubleatoi(x), strtoumaxのいくつかの組み合わせを試してみましたが、printf関数で1または1.0000....のいずれかを取得しています。

私はprintfを使ってvarを内部的に使う必要があります。 それでは、最高の組み合わせと使用するフォーマットは何ですか?

// third number (this may move position in token order) 
????? myNumber; 

strcpy(string, strtok(NULL, ",")); 
myNumber=atoi(string); 
printf("the number is %?\n", myNumber); 
g_object_set(theItem, "alpha", myNumber, NULL); // accepts n.n only 0.0 -> 1.0 
+0

'atoi'文字列を' int'のみに変換します。浮動小数点数の文字列番号には使用できません。ストロークで検索された文字列が浮動小数点数であるかどうかをテストし、[strtof - strtod](http://en.cppreference.com/w/c/string/byte/strtof)を使用して変換する必要があります。 – LPs

+0

['strtof'または' strtod'](http://en.cppreference.com/w/c/string/byte/strtof)? –

+3

'int'? 'n.n'形式で? 'int'は小数点を持たない。先行ゼロもありません。先行ゼロは表示できるものです。 –

答えて

3

ご質問は不明であるが、私はあなたが何をしたいと思うです:

double myNumber; 
myNumber = atof(string); // "0.5" for example 
printf("%03.1f", myNumber); // Output: 0.5 

フォーマッタは意味:

  • 0を - 先行ゼロ
  • 3とパッド - 合計出力は3文字以上でなければなりません(整数、10進、10分の1)
    必要に応じてより多くの出力が得られる可能性があります。
  • .1 - 小数点以下の後に1桁を表示します。

あなたが本当にintをしたいが、小数点以下を表示する場合は、私がお勧め:

int myNumber = 3; 
printf("%03.1f", (double)myNumber); // Resulting in output: "3.0" 

は全体strtok/atoi/printfの問題を避け、ちょうど試してくださいこれらのハードコーディングされたコール。そのうちの一つが作業する必要があります

g_object_set(theItem, "alpha", "0.5", NULL); // Param is a string 
g_object_set(theItem, "alpha", 0.5, NULL); // Param is a double 
g_object_set(theItem, "alpha", .5, NULL); // Param is also a double 
g_object_set(theItem, "alpha", 1, NULL); // Param is an int. 

は、1つの作品をお知らせください。

+0

私が何をしているのかはまったく分かりませんが、入力文字列は正しい形式、つまり '0.5'または' 1.0'または '0.0'です。ライブラリに文字列を渡すと、文字列としてそれを拒否し、 '0.0'の形式の' number'を要求します。 –

+2

'0.5'はIntegerに収まらないでしょう。 (あなたは整数が何であるか知っていますか?) – abelenky

+1

@artvanderlay _ライブラリに文字列を渡す_...文字列ではなくint変数を渡しています.....あなたがしたいことはまだ不明です.. – LPs

0

strtok,1,2,1.0を使用して文字列から小数点以下の数字を抽出しました。

これで、第3の数値をn.n形式のintに変換する必要があります。この形式では、1より小さい場合は先頭にゼロが必要です。

あなたはプレゼンテーションを混乱されています。すべてのC整数型は整数値を表します。つまり、0より小さい有効数字のない値は1より小さい値を持ちます。したがって、1より小さい場所値を持つ数字の記憶域を提供しません。さらに、 1未満は0であり、ある意味では自動的に先行ゼロがあります。したがって、あなたのような変換は利用可能でも必要でもありません。

一方、あなたは(すべてゼロ)末尾の小数点以下の桁数を持つ形式の整数にしたいならば、それは非常に簡単ですませんが、結果が偶数の場合、結果はもはやintが、文字列(ありますすべて保持される)。たとえば、

char decimal_integer[15]; 
int one_point_oh = 1; 

// does the right thing for 0, too: 
sprintf(decimal_integer, "%d.0", one_point_oh); 

整数値が指定された精度、つまり小数点以下の桁数に関する情報を保持したいことがあります。そのような情報は、組み込み整数または浮動小数点データ型で自然に表現することはできません。必要ならば、そのデータを別々に追跡する必要があります。


同じことが浮動小数点に適用されます。つまり、値をそこのプレゼンテーションと混同してはいけません。 C浮動小数点データ型(float,double、およびlong double)は数値を表しますが、それらの書式は表していません。書式設定の詳細を個々の値に関連付ける必要がある場合は、それらを個別に追跡する必要があります。プレゼンテーションのために番号を書式設定するときにそのような詳細を考慮します。

+0

私は理解していれば、printfはそれを複数の小数点以下の桁数で示しているので、メモリ内の実際の書式は小数点以下の桁数にすぎませんか? –

+0

@artvanderlay、あなたは理解し始めています。実際には、整数の内部表現には、*ゼロ*小数点以下の桁が含まれます。浮動小数点数の内部表現には、型と値に依存するバイナリ小数点以下の桁数(小数点ではありません)が含まれています。人間が読める一連の文字もありません。そのような文字列は、*値を書式化することによって得られます。値の固有の部分ではなく、複数の方法でフォーマットすることができます。 –

+0

明かりが始まります。私が使ってみようとしている図書館は実際には誤解を招くエラーメッセージを表示していると思われます。 –

関連する問題