質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

5回答

2919閲覧

【C言語】冗長だと思う数字入力プログラムを改善したい

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1グッド

1クリップ

投稿2017/07/17 08:46

以下のプログラムは3つの数字をスペース区切りで入力して、入力した数字を改行区切りで出力するというコードです。
C言語はあまり慣れていないので、以下のコードに冗長さを感じますが何か改善点はありますか?

#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { char inputNum[1000]; int stock[3]; char token[] = " "; char *tok; int count = 0; fgets(inputNum, sizeof(inputNum), stdin); tok = strtok(inputNum, token); while (tok != NULL) { stock[count] = atoi(tok); tok = strtok(NULL, token); count++; } for (int i = 0; i < sizeof(stock)/sizeof(stock[0]); i++) { printf("%d\n", stock[i]); } }
退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

こんにちは。

3つの数字をスペース区切りで入力して、入力した数字を改行区切りで出力するというコードです。

要件がこれだけなら、私だったらお手軽に以下の感じです。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int num0, num1, num2; 6 if (scanf("%d %d %d", &num0, &num1, &num2) != 3) 7 { 8 fprintf(stderr, "input error\n"); 9 return 1; 10 } 11 printf("%d\n%d\n%d\n", num0, num1, num2); 12}

処理する数値の数が増える可能性の有無や、改行が可笑しかった時どうするとか、周辺情報が見えないので、バランス点が見えません。
配列を使っても完全に無駄になる可能性を考慮すると、簡単確実なプログラムにしたいと思います。

投稿2017/07/17 09:26

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/17 09:37

ご回答ありがとうございます。 そうですよね。やっぱりscanf使うんですね。 fgetsだと他にもっと良いコードは書けないのでしょうか?
Chironian

2017/07/17 09:57

何を持ってして「良い」と言うのかが問題です。 そのプログラムがどのように拡張されるのか、ある程度想定して、それに対応できるように設計されたプログラムは「良い」ものです。 どんな作業をアシストするプログラムなのか見えないと、どのような拡張がありうるのか見当もつかないので、何か拡張できる仕組み(例えば配列とか)を仕込んでもまるっと無駄になるかも知れません。それは確実に「悪い」ものです。
guest

0

むしろ短い。エラー処理まできちんとやりたいなら、相応の長さになる。

配列の境界チェック
atoi関数 => strtol関数
非常に長い入力への対処

どこまで簡潔に書けるか、というのは、どこまで仕様を詰めるか、で簡単に変わります。

ちなみに私なら(ズルして)、

標準入力を1文字ずつ読み込み、数字ならそのまま、空白なら改行、それ以外なら即リターンってコードします。

投稿2017/07/17 15:21

majiponi

総合スコア1720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/17 15:22

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

0

C

1#include <stdio.h> 2 3int main(void){ 4 int i; 5 char b[1000]; 6 7 fgets(b, sizeof(b), stdin); 8 9 for(i = 0; i < 1000; i++){ 10 if(b[i] == '\0') break; 11 printf("%c", b[i] == ' ' ? '\n' : b[i]); 12 } 13 14 return 0; 15}

C初心者ですがやってみました。
数字かどうかの判定は行っていません。

C

1#include <stdio.h> 2#include <ctype.h> 3 4int main(void){ 5 int i = 0; 6 char b[1000]; 7 8 fgets(b, sizeof(b), stdin); 9 10 while(b[i] == ' ' || isdigit(b[i])){ 11 printf("%c", b[i] == ' ' ? '\n' : b[i]); 12 i++; 13 } 14 15 return 0; 16}

数字の判定を入れたバージョン。

投稿2017/07/17 15:40

編集2017/07/18 00:38
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/17 22:26

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

0

3つの数字をスペース区切りで入力して、入力した数字を改行区切りで出力

で作りました。改善点は?

c

1#include <stdio.h> 2#include <string.h> 3#define NUM 3 4 5int main(void) { 6 char inputNum[1000]; 7 int stock[NUM]={'\0'}; 8 int i,j; 9 10 fgets(inputNum, sizeof(inputNum), stdin); 11 for (i=j=0;inputNum[i]!='\n';i++){ 12 if (inputNum[i]==' '){ 13 j++; 14 }else{ 15 stock[j]=stock[j]*10+(inputNum[i]-'0'); 16 } 17 } 18 for (i=0; i<NUM; i++) { 19 printf("%d\n", stock[i]); 20 } 21}

表示するだけなら

c

1#include <stdio.h> 2#include <string.h> 3 4int main(void) { 5 char inputNum[1000]; 6 char *p; 7 p=inputNum; 8 9 fgets(inputNum, sizeof(inputNum), stdin); 10 while(p=strchr(p,' ')){ 11 *p='\n'; 12 } 13 printf("%s",inputNum); 14}

投稿2017/07/17 10:20

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

whileループをちょいと書き換えてみました。

C

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5int main(void) { 6 char inputNum[1000]; 7 int stock[3]; 8 char token[] = " "; 9 char *tok; 10 int count = 0; 11 12 fgets(inputNum, sizeof(inputNum), stdin); 13 14 tok = strtok(inputNum, token); 15 do { 16 stock[count] = atoi(tok); 17 printf("%d\n", stock[count++]); 18 } while(tok = strtok(NULL, token), tok != NULL); 19 20 return 0; 21} 22

こういうのもありかもしれませんね。

C

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5int main(void) { 6 char inputNum[1000]; 7 int stock[3]; 8 char token[] = " "; 9 char *tok; 10 int count = 0; 11 12 fgets(inputNum, sizeof(inputNum), stdin); 13 14 for(tok = strtok(inputNum, token); tok != NULL; tok = strtok(NULL, token), count++) { 15 printf("%d\n", stock[count] = atoi(tok)); 16 } 17 18 return 0; 19}

投稿2017/07/17 09:08

編集2017/07/17 09:11
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/17 09:11

ご回答ありがとうございます。
退会済みユーザー

退会済みユーザー

2017/07/17 09:12 編集

ロジック自体に大きな変更はない感じですかね。
LouiS0616

2017/07/17 09:18

空白を改行に置き換えるのもありですが、そうするとstockが更新できないですからね... 私はここまでです、他の回答の黒魔術っぷりに期待したいですね。
退会済みユーザー

退会済みユーザー

2017/07/17 09:36

ありがとうございます。 助かります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問