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

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

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

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

Q&A

解決済

2回答

1545閲覧

標準入力から入力する部分を、コマンドライン引数として読み込むように修正したい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

2クリップ

投稿2020/11/15 09:12

編集2020/11/16 14:15

前提・実現したいこと

int main(void)をint main(int argc,char *argv[])に書き換えました

発生している問題・エラーメッセージ

エラーにはなりませんが、標準出力に正しく出力されません```
コマンドライン入力に20と入力した場合に
標準出力に83621143489848422977と出力されることを求めています。

該当のソースコード

C

1 2#include <stdio.h> 3#include <stdlib.h> 4 5int main(int argc, char *argv[]) 6{ 7 char *a, *b, *c; 8 int i, n, na, nb, nc, r; 9 10 if (argc != 2) { 11 printf("usage: %s number_of_digits\n", argv[0]); 12 return 1; 13 } 14 n = atoi(argv[1]); 15 if (n < 1) { 16 puts("number of digits should be greater than 1"); 17 return 1; 18 } 19 20 a = calloc(n + 1, sizeof(char)); 21 b = calloc(n + 1, sizeof(char)); 22 c = calloc(n + 1, sizeof(char)); 23 if ((a == NULL) || (b == NULL) || (c == NULL)) { 24 printf("cannot allocate memory.\n"); 25 exit(1); 26 } 27 28 a[0] = 0; 29 b[0] = 1; 30 na = nb = 1; 31 32 for (; nb <= n;) { 33 r = 0; 34 for (i = 0; i != nb; i++) { 35 r = a[i] + b[i] + r; 36 c[i] = r % 10; 37 r = r / 10; 38 } 39 if (r == 1) { 40 c[i] = 1; 41 nc = nb + 1; 42 } else { 43 nc = nb; 44 } 45 for (i = 0; i != nb; i++) a[i] = b[i]; 46 for (i = 0; i != nc; i++) b[i] = c[i]; 47 na = nb; 48 nb = nc; 49 } 50 51 for (i = na - 1; i >= 0; i--) printf("%d", a[i]); 52 printf("\n"); 53 54 free(a); 55 free(b); 56 free(c); 57 58 return 0; 59}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

「コマンドライン入力」に正の整数値nを入力すると、動的な配列を生成し、n桁以下のフィボナッチ数で最大のものを計算して画面上(標準出力)に表示するプログラムを作成したい

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

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

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

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

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

kazuma-s

2020/11/15 12:18

質問は編集できます。 「C言語```ここに言語を入力」ではなく「```C」と書いてください。 「コード」ではなく、#include <stdio.h> から } までのコードを書いてください。 「}```」ではなく、単独で「```」と書いてください。
guest

回答2

0

まずは、「C言語 コマンドライン引数」でぐぐって、どういう形で引数を得るかを調べましょう。
コマンドラインで持ってくる場合には、文字列で持ってくる形となるので、整数に変換する必要があります

投稿2020/11/15 09:32

y_waiwai

総合スコア87719

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

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

退会済みユーザー

退会済みユーザー

2020/11/15 10:02

ありがとうございます。 まずは、ぐぐってみます。
退会済みユーザー

退会済みユーザー

2020/11/15 12:11

ググってみましたが、回答に結び付くものはありませんでした。 私の理解力がないのかもしれません。 プログラミングの初心者です。 可能でありましたら、誤り個所など具体的にご教示いただけましたらありがたいです。 よろしくお願いします。
y_waiwai

2020/11/15 12:15

コマンドラインの引数はargv[1]、argv[2]、...に文字列として格納され、引数の数はargcにいれてmainが実行されます。 第一引数はargv[1]にはいってますんで確認してみよう
退会済みユーザー

退会済みユーザー

2020/11/15 23:21

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

0

ベストアンサー

修正箇所を具体的に示します。

diff

1- scanf("%d", &n); 2+ if (argc != 2 || (n = atoi(argv[1])) < 1) return 1;

これで期待通りの結果かどうかお知らせください。

追記
コードを見やすくしてほしいというのは、次のように書いてほしかったのです。

C

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(int argc, char *argv[]) 5{ 6 char *a, *b, *c; 7 int i, n, na, nb, nc, r; 8 9 if (argc != 2) { 10 printf("usage: %s number_of_digits\n", argv[0]); 11 return 1; 12 } 13 n = atoi(argv[1]); 14 if (n < 1) { 15 puts("number of digits should be greater than 1"); 16 return 1; 17 } 18 19 a = calloc(n + 1, sizeof(char)); 20 b = calloc(n + 1, sizeof(char)); 21 c = calloc(n + 1, sizeof(char)); 22 if ((a == NULL) || (b == NULL) || (c == NULL)) { 23 printf("cannot allocate memory.\n"); 24 exit(1); 25 } 26 27 a[0] = 0; 28 b[0] = 1; 29 na = nb = 1; 30 31 for (; nb <= n;) { 32 r = 0; 33 for (i = 0; i != nb; i++) { 34 r = a[i] + b[i] + r; 35 c[i] = r % 10; 36 r = r / 10; 37 } 38 if (r == 1) { 39 c[i] = 1; 40 nc = nb + 1; 41 } else { 42 nc = nb; 43 } 44 for (i = 0; i != nb; i++) a[i] = b[i]; 45 for (i = 0; i != nc; i++) b[i] = c[i]; 46 na = nb; 47 nb = nc; 48 } 49 50 for (i = na - 1; i >= 0; i--) printf("%d", a[i]); 51 printf("\n"); 52 53 free(a); 54 free(b); 55 free(c); 56 57 return 0; 58}

main関数の始まりと終わりが明確です。
if文の始まりと終わり、for文の始まりと終わりが明確で
二重のfor文のネストも分かります。

質問のコードのように左詰めで書くと、for文のネストが分かりません。
たくさんある行頭の } を見て、これはなんの終わりかが分かりません。
プログラムの構造が理解しづらいものとなります。

投稿2020/11/15 12:20

編集2020/11/16 00:46
kazuma-s

総合スコア8224

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

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

退会済みユーザー

退会済みユーザー

2020/11/15 12:42

ありがとうございます。 期待通りの結果がでました。
kazuma-s

2020/11/15 12:44

この修正は、ググって調べた説明に合致しますか? argc や argv の意味は理解しましたか? 質問を編集してコードを見やすくしてください。
pickasound

2021/11/11 20:42

すみません、具体的に修正箇所をどの部分へ入力するば良いのか、分かりませんでした。教えて頂けませんでしょうか。宜しくお願い致します。
dodox86

2021/11/11 22:56

よくよく見たら1年前の質問回答。一体どういうことなんだか。
pickasound

2021/11/14 20:22

一年後に同じ課題に取り組んでいる別のユーザーですが、示されている修正箇所を、プログラムのどの部分に入れ込めが良いのか、もしくは、入れ替えれば良いのか、いくつか試しましたが、結果を得ることができず、質問させて頂いていました。もし、わかる方で、教えていただけるのであれば、宜しくお願いします。
thkana

2021/11/14 23:28

そういうのは言わなきゃわからないです。説明がなきゃただの変なコメントですから。 で、PCで見ているのならタイトルの下の回答の投稿日の隣、[編集]の部分がリンクになっていて質問の編集履歴が見られるので、質問のもともとのプログラムがどうだったか、それがどう変更されたかをみると参考になるのではないかと思います。 ただし、変更後のプログラムがちゃんと動くものかどうか私は検証していません。解決になっているので動いたのだとは思いますが。 それと、スマホの場合の更新履歴の見方は私は知りません。
pickasound

2021/11/15 13:12

ご説明ありがとうございます。履歴見れるのは知りませんでした。早速確認後、試しては見たのですが、やはり動きませんでした。履歴の部分にあるコードに、上記で修正箇所として回答があった、以下部分を入れ込むと動くのかと思っているのですが、どこに入るのかが分かりません。もし、分かる方いましたら、教えてください、宜しくお願いします。 - scanf("%d", &n); + if (argc != 2 || (n = atoi(argv[1])) < 1) return 1;
thkana

2021/11/15 14:21

行頭の-は行削除、+は行追加の意味です。 しばしば使われるdiffというツールの出力形式です。 あなたの状況が全くわからないので、現状のソースコードと状況をつけて新たな質問を立てたほうがよろしいかと思います。 なお「動きませんでした」とか「うまくいきませんでした」というのはNGワードと考えてください。 「動かなかった」「うまくいかなかった」のではなく、例えばエラーが出るとか、期待したのと違う何かの結果が出るとか、無反応になるとか、とにかくなにかそこで「起こった事態」があるはずです。自分で解決しようとするのならその事態をちゃんと観察して解析すること、質問であればその事態をちゃんと質問に記述して回答者に伝えてください。
pickasound

2021/11/15 19:51

ご説明ありがとうございます。新たな質問を立てさせてもらいましたので、何かわかる場合には、宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問