小数点を取り除くには?

解決


ネロ  2006-09-08 11:50:47  No: 62955  IP: 192.*.*.*

こんにちわ。

char型の文字列"1.00"〜"-1.00"について、

まず小数点を取り除き、数値"100"〜"-100"としてint型に格納する。

そして、マイナスの符号がついているなら、
ビットを反転させ、1を加える

という処理を行おうと思っているのですが、C言語でどのように
記述すればいいのでしょうか?

以上、宜しくお願いします。

編集 削除
Blue  2006-09-08 12:42:58  No: 62956  IP: 192.*.*.*

>まず小数点を取り除き
strchr関数とstrcpy関数あたりを使って削除してください。
(C++ならば簡単なんだが)

>そして、マイナスの符号がついているなら、
>ビットを反転させ、1を加える

int n = -100; 
printf( "%x\n", n );

はどんな文字列が表示されますか?望んでいたものではないでしょうか?
(つまり、C言語ではちゃんと符号ビットを持っているということ)

編集 削除
tetrapod  2006-09-08 15:19:16  No: 62957  IP: 192.*.*.*

strなんちゃらで削除するくらいなら俺ならこっち
if (sscanf(str, "%d.%d", &x, &y)==2) z=x*100+y;

編集 削除
Blue  2006-09-08 15:31:33  No: 62958  IP: 192.*.*.*

>strなんちゃらで削除するくらいなら俺ならこっち
書式が決まっているなら、sscanfで十分ですね。


>strchr関数とstrcpy関数あたりを使って削除してください。
strcpyを使うよりも、memmove関数の方がよかったかも。

char s[] = "-1.01";
char* pos = strchr( s, '.' );
if ( pos != NULL )
{
    memmove( pos, pos + 1, strlen( pos ) );
}
int n = strtol( s, NULL, 10 );

編集 削除
tetrapod  2006-09-08 15:39:36  No: 62959  IP: 192.*.*.*

double d;
if (sscanf(str,"%g",&d)==1) z=(int)(d*100);
という人がいたらツッコもうと思っていたのですがさすがにいませんか。

編集 削除
yoh2  2006-09-08 21:34:44  No: 62960  IP: 192.*.*.*

z = (int)(strtod(str, NULL) * 100);

なんてことを考えた私はツッコミの対象ですか?
"-1.00" - "1.00"の201個中、
VC++ 6, 2005  : 6個
bcc32、gcc、dmc: 88個
の変換ミスがあったので、

  z = floor(strtod(str, NULL) * 100 + .5);

で誤魔化して満足してしまっては処置なしですか?(^^;

編集 削除
ネロ  2006-09-08 23:51:32  No: 62961  IP: 192.*.*.*

皆さまからのアドバイスで問題が解決出来ました。
ありがとうございました。

編集 削除