掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.27440

atoi関数自作。
投稿者---シキ(2006/06/29 21:02:32)


こんばんは、シキと申します。
UNIXでatoi関数を自作しているのですが、これだと正の数は表示してくれるのですが、「1234」を「-1234」のように負の数にすると表示してくれません。
どうすれば負の数も表示するようになるのでしょうか?
どなたか教えていただけませんかm(_ _)m

include <stdio.h>
main()
{
     char *str = "1234"

     printf("%s -> %d\n",str,atoi(str));
}

atoi(s)
char s[];
{
     int i,n;

     for(n=i=0; s[i]; ++i)
          n=n*10 + (s[i] - '0');
     return(n)
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:atoi関数自作。 27441 papa 2006/06/29 21:08:49
<子記事> Re:atoi関数自作。 27447 たかぎ 2006/06/29 23:48:10
<子記事> Re:atoi関数自作。 27470 shu 2006/07/01 12:55:03


No.27441

Re:atoi関数自作。
投稿者---papa(2006/06/29 21:08:49)


>どうすれば負の数も表示するようになるのでしょうか?

atoi()中のforループの中で、0〜9の場合とマイナス符号の場合とを
区別して考えてください。

ところで、投稿されたソースコードは以下の理由により
そのままではコンパイルできません。
次回からは、コピー&ペーストするだけでコンパイルできる
ソースコードを載せてください。
 ・includeの前に#がない
 ・文の終端を示すセミコロンが抜けている箇所がある


この投稿にコメントする

削除パスワード

No.27442

Re:atoi関数自作。
投稿者---シキ(2006/06/29 21:17:16)


回答ありがとうございます。

>atoi()中のforループの中で、0〜9の場合とマイナス符号の場合とを
>区別して考えてください。
質問ばかりして申し訳無いのですが、if文で区別するということでしょうか?

>ところで、投稿されたソースコードは以下の理由により
>そのままではコンパイルできません。
>次回からは、コピー&ペーストするだけでコンパイルできる
>ソースコードを載せてください。
すみません。書いたつもりだったんですが、書けていなかったようです。
お手数をおかけして申し訳ありませんでした(><;


この投稿にコメントする

削除パスワード

No.27445

Re:atoi関数自作。
投稿者---papa(2006/06/29 21:56:46)


>質問ばかりして申し訳無いのですが、if文で区別するということでしょうか?

ifでもいいですし、switch〜caseでもいいです。
正しく動作する関数は一通りとは限りません。いろんなやり方にチャレンジしてみてください。


この投稿にコメントする

削除パスワード

No.27446

Re:atoi関数自作。
投稿者---シキ(2006/06/29 22:31:11)


有り難うございます(><
とりあえず、色々と試してみることにします。
また何かあればよろしくお願いいたしますm(_ _)m


この投稿にコメントする

削除パスワード

No.27448

Re:atoi関数自作。
投稿者---シキ(2006/06/29 23:59:24)


すみません。やっぱりうまくいきません。

#include <stdio.h>
main()
{
     char *str = "1234";
     char *str = "-1234";

     printf("%s -> %d\n",str,atoi(str));
     printf("%s -> %d\n",str,atoi(str2));

}

atoi(s)
char s[];
{
     int i,n;

     for(n=i=0; s[i]; ++i)
        if(i>=0 && i<=9){
            n=n*10+(s[i]-'0');
        }else{
            return(n);
        }
    }
    return(n);
}



このようにif文を付け加えてみると、マイナスは表示されるのですがその後の数字がやはりおかしくなってしまいます。
if文がおかしいのでしょうか?




この投稿にコメントする

削除パスワード

No.27456

Re:atoi関数自作。
投稿者---ぽへぇ(2006/06/30 06:13:52)


本質的なところではありませんが

>atoi(s)
>char s[];
>{
どんな参考書を読んだのかはわかりませんが、
すでに時代遅れの書き方です。



この投稿にコメントする

削除パスワード

No.27457

Re:atoi関数自作。
投稿者---επιστημη(2006/06/30 06:39:33)


int atoi(const char* s) {
 /* 正のとき */
 if ( *s != '-' ) {
  従来通り
 } else {
  return -atoi(s+1);
 }
}

…これでよくねぇ?



この投稿にコメントする

削除パスワード

No.27458

Re:atoi関数自作。
投稿者---papa(2006/06/30 09:09:03)


> char *str = "1234";
> char *str = "-1234";

strの定義が重複しています。このままではコンパイルできません。

> printf("%s -> %d\n",str,atoi(str));
> printf("%s -> %d\n",str,atoi(str2));

2個目のprintfは、str2,atoi(str2) ではないですか?

>atoi(s)
>char s[];

int atoi(char *s) とでも書くのが現在のやり方でありましょう。
また、main関数の後ろにatoi関数が来ていますので、
atoi関数のプロトタイプ宣言が必要です。コンパイル時に、
そういうメッセージが出るはずです。

> for(n=i=0; s[i]; ++i)
> if(i>=0 && i<=9){
> n=n*10+(s[i]-'0');

if文の条件で、どうして添字の範囲を判定しているのでしょうか?
添字ではなく、配列に入っている値を判定するのではないでしょうか。

> }else{
> return(n);

マイナス符号が付いている場合を積極的に判定する必要はないのでしょうか。


ところで、投稿なさる前にご自分でコンパイル〜実行を
ちゃんと行なわれていますか?


この投稿にコメントする

削除パスワード

No.27447

Re:atoi関数自作。
投稿者---たかぎ(2006/06/29 23:48:10)
http://takagi.in/


何か非常にタイムリーな話題なのでレスします。
実は、つい先ほどatoi関数のコードをブログで公開したところです。
汚いソースですが、よければどうぞ。



この投稿にコメントする

削除パスワード

No.27451

Re:atoi関数自作。
投稿者---シキ(2006/06/30 02:25:51)


回答有難うございます。
やっぱり判定の関数を別に作らないと出来ませんよね(><;



この投稿にコメントする

削除パスワード

No.27459

Re:atoi関数自作。
投稿者---acid(2006/06/30 09:09:03)


ちょっと待て、判定関数なんか作ってどうする。

ぶっちゃけεπιστημηさんのでいいんだが、
マイナスだったらマイナスの次から数字に変換して、最後に-1かければいいじゃん。

>atoi(s)
>char s[];
>{
あとこういう書き方はやめてくれ。
間違いじゃないのかもしれないが、笑われるだけです。


この投稿にコメントする

削除パスワード

No.27469

Re:atoi関数自作。
投稿者---Hermit(2006/06/30 20:24:19)


>あとこういう書き方はやめてくれ。
>間違いじゃないのかもしれないが、笑われるだけです。

単純に、参考にした書籍のせいかもしれませんが、
まだ、こういう書き方しか使えないコンパイラも残っているのではないでしょうか。
2年前辞めた会社にはまだありましたし。
(15年位前の製造機械の制御用だったけど、まだ動くからということで使ってたし、プログラム変更もしていたし)


この投稿にコメントする

削除パスワード

No.27460

Re:atoi関数自作。
投稿者---たかぎ(2006/06/30 09:55:32)
http://takagi.in/


>回答有難うございます。
>やっぱり判定の関数を別に作らないと出来ませんよね(><;

別の関数にする必要は必ずしもありません。
atoi関数のことだけ考えるのであれば、直に記述しても問題ないと思います。




この投稿にコメントする

削除パスワード

No.27470

Re:atoi関数自作。
投稿者---shu(2006/07/01 12:55:03)


int shu_atoi(const char *s)
{
    int n = 0, i;
    
    //
    for (i = (*s == '-'); isdigit(s[i]); i++) {
        n = n * 10 + (s[i] - '0');
    }
    
    return (*s == '-') ? -n : n;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧