ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュのscanf()とgets()【再掲載】

  • mixiチェック
  • このエントリーをはてなブックマークに追加
以前にあげたトピを誤って削除してしまいました。
書き込みいただいた方へのお礼の為に再度、立てます。
ややこしいことをして申し訳ありません。

現在、私は新C言語入門という本とネットでC言語を勉強している入門者です。
CentOSを使用してgccでコンパイルしています。

現在、本を参考に自分で問題を考えていますが、悩んでいます。
考えた問題は「キーボードから用意した配列にEOF(Ctrl+D)を入力するまで、入力数値を格納してそれを表示する」です。
悩んでいる部分はキーボードへの数値の安全な入力です。

本によると、『scanf()関数を使用して数値を入力するとおかしな動作をすることがある。初心者向きで安全なのが、gets()とatoi()を併用した方法』とあります。
ですが、ネットの情報を見るとgets()関数は使用すべきでないと本の内容を否定する情報が多く、何が良いかを判断できずにいます。

私が書いたプログラムで一応、動くものが以下です。
もっとよい方法があれば是非、ご教示ください。

#include<stdio.h>
#include<stdlib.h> /*for atoi()*/
int main(void){
char inum[1000];/*キーボードからの入力値*/
int array[1000];/*入力値を整数にして配列へ格納*/
int len;
int i;

printf("整数を入力して下さい。終了はCtrl+D\n");

i = 0;
while(gets(inum) != NULL){/*安全な数値入力*/
array[i] = atoi(inum);
len =i;
i++;
}

printf("入力値を表示\n");
for(i=0; i <len+1; i++){/*配列を表示*/
printf("%d\n",array[i]);
}

return 0;

}

コメント(3)

ご回答頂いた方々、しまでんさん、d-goatさんには大変失礼しました。
自分のコメントの修正(脱字訂正)の為、コメント削除のつもりがトピごと削除していしました。本当にすいません。

しまでんさんにはオーバーフローのご指摘、atoi()がエラーを返さない関数であることをご教示いただきました。

d-goatさんには個人の好みもあるけれど、while文よりもfor文の方が見やすいとアドバイスを頂きました。

改めて、個別にお礼を言わせて頂きます。

>しまでんさん
素早いご回答有難うございます。
gets()関数のオーバーフローのご指摘を有難うございます。
また、atoi()関数がエラー情報を返さないというのは知りませんでした。

私の情報提示不足だったので申し訳ありませんでしたが、
現状ではポインタや構造体の勉強は、やっと本を読み始めたところです。
fgets()関数はポインタを理解してから試して見ます。(atoi()関数の問題は残りますが・・・)『C言語入門者』の説明だけでは、何を知っているのか判らないですね。すません。


今回の問題を自分で考えた経緯は
・ループの理解を深めること。
・配列を利用すること。
・入力プログラムが上手く作れたら、更にループ、演算処理の勉強の為に昇順、降順、素数を昇順などのルールで並べ替える。

などを練習目的と考えていました。

考えている内にキーボードから入力した後で配列の要素数が判明する方が、ループを考える上で、お面白いかなと思ったのですが、安全に数値を入力するプログラムが難しかったです。本で『初心者向き』と断り書きの上でgets()とatoi()を使っての数値入力が紹介されていたのが、判った気がします。

とりあえず、自分の作ったプログラムで動くのでこれを基にしようかなと思います。勿論、もっと良い方法があれば知りたいです。


>d-goatさん
forループでも作ってみますね。回答有難うございます。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。