C言語関係掲示板

過去ログ

No.1176 小数点が含まれる数字の文字列を整数の少数点に変換

[戻る] [ホームページ]
No.15294

小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---やくも(2004/07/06 19:54:27)


小数点が含まれる数字の文字列を整数の少数点に変換したいのですが、
以下の文字列の数字を整数に変換するもので行うと0になってしまい
ます。
上手く行うにはどうすればよいですか。

#include <stdio.h>

void main()
{
    char *x = "401K" ;
    char *y = "-1999" ;
    char *z = "123456" ;
    char num[20] ;
    int i, val ;

    memset(num,'\0',sizeof(num)) ;

    do {
        printf("符号付きで10桁以内の数値を入力して下さい: ") ;
        scanf("%s", num) ;
    } while (strlen(num) <=0 || strlen(num) >9) ;

    val = chg_atoi(num) ;

    printf("%s -> %d\n", num, val) ;
}
int chg_atoi(num)
    char *num ;
{
    int val = 0 ;
    int sgn = 0 ;

    if(*num == '-') {
        sgn = 1 ;
        num++ ;
    }

    while(*num != '\0') {
        if (*num < '0' || *num >'9')
            return 0 ;

        val = val * 10 + *num - '0';
        num++ ;
    }

    if(sgn)
        return -val ;
    else
        return val ;
}




No.15297

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---REE(2004/07/06 20:18:37)


>小数点が含まれる数字の文字列を整数の少数点に変換したいのですが、

整数の小数点って何でしょう?
整数には小数点はありません・・・

>以下の文字列の数字を整数に変換するもので行うと0になってしまい
>ます。

関数が小数点を含むと0を返すようになっているからです。
まあ、整数に変換する関数ですから、妥当な仕様だと思われます。



No.15298

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---ぽこ(2004/07/06 20:20:25)


いくつかコメントをば。

>小数点が含まれる数字の文字列を整数の少数点に変換したいのですが、
整数には小数点はないと思いますが?

>以下の文字列の数字を整数に変換するもので行うと0になってしまい
>ます。
chg_atoi()にて、
        if (*num < '0' || *num >'9')
            return 0 ;

と書かれてありますので、文字列numに数字以外のものが入っていれば
0になります。
        if (*num < '0' || *num >'9')
            return sgn? -val : val;

とすれば少なくともそれまでのvalの値は返せます。

初心者の方でしょうか?
利用されている参考書が古い気がします。




No.15299

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---あかま(2004/07/06 20:23:02)


>小数点が含まれる数字の文字列を整数の少数点に変換したいのですが、
実数のことですか?

>以下の文字列の数字を整数に変換するもので行うと0になってしまいます。
当然、整数型用ですのでそういう仕様です。

>上手く行うにはどうすればよいですか。
変数を一通り実数型に変更してから、'.'を扱えるようにすればいいでしょう。

丸投げ禁止なので自分で少しでも手をつけてみてください。
まず、このコード自体読めていますか?
読めていなければ拡張は難しいでしょう。

あとこのコード、書き方が古いです。


No.15300

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---ニタチ(2004/07/06 20:52:05)


>やくもさん

 memset(num,'\0',sizeof(num)) ;は、
 numの宣言時にchar num[20] = {'\0'} ;とするだけでもOKです。


>あかまさん

>あとこのコード、書き方が古いです。

 すこし疑問に思ったので質問します。
 どこら辺が古いのでしょうか?C言語歴が浅いのでよくわかりません・・。
 私が思ったのは、
  各関数のプロトタイプ宣言をしていないところと、
int chg_atoi(num)
    char *num ;
{
 の書き方ですが、どうなんでしょう??
 よろしければお願いします。



No.15301

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---あかま(2004/07/06 21:08:36)


int chg_atoi(num)
    char *num ;
{
 >の書き方ですが、どうなんでしょう??
ここですね。昔はこんな書き方をしたらしいです。

>各関数のプロトタイプ宣言をしていないところと、
プロトタイプ宣言はどうなんでしょう?
必ずしなければならないのでしたっけ?

> memset(num,'\0',sizeof(num)) ;は、
> numの宣言時にchar num[20] = {'\0'} ;とするだけでもOKです。
scanfで上書きするのでmemset自体がいらなかったり。
関係ないけど空文字列にするのもnum[0]='\0';で十分。


No.15303

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---YuO(2004/07/06 22:01:54)


int chg_atoi(num)
    char *num ;
{
の書き方ですが、どうなんでしょう??
ここですね。昔はこんな書き方をしたらしいです。


新しいとは言いませんが,これは未だに標準Cで認められています。
廃要素とはされていますが。
#つまり,将来において認められなくなるかもしれない,ということ。


>>各関数のプロトタイプ宣言をしていないところと、
>プロトタイプ宣言はどうなんでしょう?
>必ずしなければならないのでしたっけ?

関数定義が呼び出しより前にある場合を除き,
関数の宣言は呼び出しより前に必ず無いといけません。
古くISO/IEC 9899:1990の時代であれば,宣言されていない関数の呼び出しは,
呼び出しを含むスコープにおいてextern int foo ();のように宣言されたように振る舞いましたが,
これは標準Cから削除されています。



No.15310

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---あかま(2004/07/07 05:17:21)


>新しいとは言いませんが,これは未だに標準Cで認められています。
>廃要素とはされていますが。
>#つまり,将来において認められなくなるかもしれない,ということ。
コンパイルできるのはコンパイラが昔のコードの互換性のために残している
なんて話を聞いたことがあるので(聞き間違いだったかも)、もう使えないのかと思っていました。
どちらにしろ使うものでもないですが。


>関数定義が呼び出しより前にある場合を除き,
>関数の宣言は呼び出しより前に必ず無いといけません。
そうでしたか。
最近別スレッドでもint foo();のintは書かなければいけない。
なんてのがありましたが、「暗黙の〜」みたいのは無くす方向で動いてるんですね。

よく図書館で古いCの本を読むのですが知識がごちゃまぜになっているようです。


No.15312

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---ニタチ(2004/07/07 08:46:10)


 あかまさん、YuOさんありがとうございます。

>> memset(num,'\0',sizeof(num)) ;は、
>> numの宣言時にchar num[20] = {'\0'} ;とするだけでもOKです。
>scanfで上書きするのでmemset自体がいらなかったり。
>関係ないけど空文字列にするのもnum[0]='\0';で十分。

 あ、そうですね。memset()だけに目がいってしまいました。


No.15302

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---やくも(2004/07/06 21:18:56)


すみません
別にまる投げにしたのではないのですが、
整数型をつくったと、1.3との少数点のものを
変換しょうとしたら上手くいかず、ヒントでと思い。

しかし、まる投げなってしまって申し訳ありません。

参考書ですか。
そこらへんにある本を見ています。
多分古いかもしれません。


No.15305

Re:ヒントということなので
投稿者---ミスター義(2004/07/06 23:17:32)


ヒントということなので

整数部と小数部の位置はわかるのですから
整数部と少数部の文字を数字にして組み合わせれば
いいのではないですか。

12.34
「12」と「34」の整数にする
「34」を0.34にする
12と0.34を加算する

でどうでしょうか。





No.15308

もう少し詳しく
投稿者---やくも(2004/07/07 02:02:42)


>ヒントということなので
>
>整数部と小数部の位置はわかるのですから
>整数部と少数部の文字を数字にして組み合わせれば
>いいのではないですか。
>
>12.34
>「12」と「34」の整数にする
>「34」を0.34にする
>12と0.34を加算する
>
>でどうでしょうか。
>
>




No.15309

Re:もう少し詳しく
投稿者---あかま(2004/07/07 05:00:43)


タイトルだけで用件を伝えるのは失礼かと。
どこが分からないのか書かないと要点を絞った説明もできません。
1から10まで説明しろというのなら別ですが(これも失礼な話です)。

>12.34
>「12」と「34」の整数にする
ピリオドが来るまでの文字列を整数Aにする。
ピリオドが来てから文字列が終わるまでを整数Bにする。

>「34」を0.34にする
Bを10のn乗で割る(nはBに変換した文字の数)

>12と0.34を加算する
A+B


No.15321

ご迷惑及び失礼いたしました。
投稿者---やくも(2004/07/07 12:47:09)


失礼およびご迷惑をかけました。

私から質問をしているの不適切な書込みで申し訳ありません。

皆さんの書込みをもとに試みてみます。


No.15322

向学のために
投稿者---ミスター義(2004/07/07 13:41:01)


>Bを10のn乗で割る(nはBに変換した文字の数)
10のn乗をC言語で実現するすにはどうすればいいのですか
簡単にできるのですか。



No.15323

Re:向学のために
投稿者---kng(2004/07/07 13:50:28)


>10のn乗をC言語で実現するすにはどうすればいいのですか
pow()で出来ると思いますが・・・


No.15324

Re:向学のために
投稿者---REE(2004/07/07 13:50:36)


>>Bを10のn乗で割る(nはBに変換した文字の数)
>10のn乗をC言語で実現するすにはどうすればいいのですか
>簡単にできるのですか。

double型になりますが、pow関数が一番簡単でしょう。

整数型でやりたい場合は、ループで計算することになります。
nはそんなに大きくならないでしょうから、処理速度は問題にはならないでしょう。



No.15325

一応、それらしものは
投稿者---やくも(2004/07/07 14:05:22)


賢いとは言いがたいですが、一応できました。

出力結果が「12.340000」となってしまいます。
不要な、ゼロと取り除くにはどうしたらいいんですか。

#include <stdio.h>

main()
{
    char    str[] = "12.34" ;
    double  val ;
    int     seisu ;
    double  syousu ;
    int     n_jyo ;
    int     i,j,cnt ;

    seisu = 0 ;
    syousu = 0 ;
    n_jyo = 10 ;
    cnt = 0 ;

    for (i=0; i<strlen(str) ; i++) {
        if (str[i] != '.' ) {
            seisu = seisu * 10 + str[i] -'0' ;
        } else {
            for (j=i+1; str[j]!='\0'; j++) {
                syousu = syousu * 10 + str[j] -'0' ;
                cnt++ ;
            }
            break ;
        }
    }

    for (i=1; i<cnt; i++) {
        n_jyo = n_jyo *10 ;
    }
    syousu = syousu / n_jyo ;

    printf("%d\n",seisu) ;
    printf("%f\n",syousu) ;

    val = seisu + syousu ;
    printf("%f\n",val) ;
}



No.15326

Re:一応、それらしものは
投稿者---REE(2004/07/07 14:08:50)


>出力結果が「12.340000」となってしまいます。
>不要な、ゼロと取り除くにはどうしたらいいんですか。

printf("%.*f\n", cnt, val) ;



No.15307

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---nop(2004/07/07 00:09:58)


>小数点が含まれる数字の文字列を整数の少数点に変換したいのですが、

strtol()、strtod() 辺りを使用されてみては?



No.15311

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---ぽへぇ(2004/07/07 06:47:03)


>小数点が含まれる数字の文字列を整数の少数点に変換したいのですが、
こういうこと?

char    strd[] = "3.1415926";
double  d;

sscanf(strd, "%lf", &d);
printf("%f", d);



No.15328

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---ZAQ(2004/07/07 16:58:35)


double nyuuryoku(void)
{
        double suuji=0.0,suuji1=0.0,suuji2=0.0,d=1;
        int n,i,count=1;
        char k[10];
        gets(k);
        for(n=0;k[n]!='\0';n++)
        {
                if(k[n]=='.')break;
                if(k[n]=='-'){d=d*-1;}
                else{suuji1=suuji1*10+(k[n]-'0');}
        }
        if(k[n]=='.')
        {
                for(i=n+1;k[i]!='\0';i++)
                {
                        suuji2=suuji2+(k[i]-'0')/(count*10);
                        count++;
                }
        }
        suuji=suuji1+suuji2;
        suuji=d*suuji;
        return suuji;
}
いろいろと間違っている。とか言われた・・・・


No.15332

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---ぽへぇ(2004/07/07 19:39:03)


>いろいろと間違っている。とか言われた・・・・

sscanf や atof も使えるだろうし、atofの実装例ならK&Rにもあったし。
どうしても自作したいの? 演習?
修正版↓

double nyuuryoku(void)
{
        double suuji=0.0,suuji1=0.0,suuji2=0.0,d=1;
        int n,i;
        double  count = 10.;
        char k[10];
        gets(k);
        for(n=0;k[n]!='\0';n++)
        {
                if(k[n]=='.')break;
                if(k[n]=='-'){d = -1.;}
                else{suuji1=suuji1*10+(k[n]-'0');}
        }
        if(k[n]=='.')
        {
                for(i=n+1;k[i]!='\0';i++)
                {
                        suuji2=suuji2+(k[i]-'0')/count;
                        count *= 10.;
                }
        }
        suuji=suuji1+suuji2;
        suuji=d*suuji;
        return suuji;
}




No.15340

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---やくも(2004/07/08 10:44:37)


>sscanf や atof も使えるだろうし、atofの実装例ならK&Rにもあったし。
>どうしても自作したいの? 演習?


演習、関数の自作ではありません。

小数点が含まれる数字の文字列を整数の少数点に変換したかったのですが
どんな関数を使用すれば実現できるのか浮かんでこなかったののですから
手っ取りばやく自作と考えました。

皆さんありがとうございました。



No.15341

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---ニタチ(2004/07/08 11:17:49)


>小数点が含まれる数字の文字列を整数の少数点に変換したかったのですが

 あの〜皆さんが指摘してますが、
 「小数点が含まれる数字の文字列を、実数に変換したかった」
 という風に、きちんとした言葉を使ってください・・・。


No.15342

Re:小数点が含まれる数字の文字列を整数の少数点に変換
投稿者---nop(2004/07/08 12:28:09)


>どんな関数を使用すれば実現できるのか浮かんでこなかったののですから
>手っ取りばやく自作と考えました。

自作するより、調べた方が早いし正確だ。