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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

3回答

4286閲覧

C言語でコマンドライン引数を使用して文字列を連結表示させたい

tunt

総合スコア14

C

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2018/08/24 07:29

前提・実現したいこと

最近C言語を勉強勉強しはじめたC言語初心者です。
現在、コマンドライン引数(argc,argv[])を使用して文字列を連結表示させるプログラムを作成しているのですが、うまくいきません。

※コマンドライン引数が「abc_123_def」の場合の場合は「abc123def」と出力したいです。

ご指摘、ヒント等あればご教授お願い致します。

###ソースコード

C

1/*----------文字列の長さを返す----------*/ 2 3int str_length(char s[]) { 4 5 int len = 0; 6 7 while (s[len]) 8 9 len++; 10 11 return len; 12 13} 14 15 16int main(int argc, char *argv[]) 17{ 18 19 /* 20 21 ※コマンドライン引数が「abc 123 def」の場合 22 23 [0] [1] [2] [3] [4] ... 24 argv[1] a b c \0 25 argv[2] 1 2 3 \0 26 argv[3] d e f \0 27 . 28 . 29 . 30 31 */ 32 33 int i; 34 int j = 0; 35 int wlen; 36 37 printf("確認用:引数の総個数 = %d\n", argc); 38 39 for (i = 1; i < argc; i++) 40 { 41 42 wlen = str_length(argv[j]); 43 44 for (j = 0; j < wlen; j++) 45 { 46 47 printf("%s", &argv[i][j]); 48 49 j++; 50 51 return j; 52 } 53 } 54 55 56 getchar(); 57 58 return 0; 59}

補足情報

標準関数「strcat」を使用してもできるみたいなのですが、それについてのヒント等もあればご教授お願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

単に要素を順に出力するだけですから、そんなに難しく考える必要は無いです。

C

1for(int i = 1; i < argc; ++i) { 2 printf("%s", argv[i]); 3} 4printf("\n");

otnさんがご指摘の点に加えて、もう一つ。

C

wlen = str_length(argv[j]);

ここ、渡すべきは argv[j] ではなく argv[i] じゃないでしょうか。

投稿2018/08/24 07:39

編集2018/08/24 08:43
LouiS0616

総合スコア35660

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

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

tunt

2018/08/24 07:45

回答ありがとうございます。 もちろんそれで出力できることは承知しているのですが、こういうやり方で出力してみたくて・・・
LouiS0616

2018/08/24 07:48 編集

なるほど。 それなら、どんなふうに『うまくいかない』のかもうちょっと詳しく書いた方が良かったですね。 ループ中の j++ が悪さをしているように思えます。 また、文字を出力するのは printf("%c", argv[i][j]) で良いのでは。
LouiS0616

2018/08/24 07:48

あれ、return j も不思議な位置にありますね。 どうしてここに return 文を入れようと思ったのでしょうか?
tunt

2018/08/24 08:37

返信ありがとうございます。 私の説明不足でした、申し訳ありません。 for文をまわしたいのでreturnで戻せばいいのかな、と思っていたのですが・・・違うみたいですね 勉強しなおします
LouiS0616

2018/08/24 08:44

returnすると関数から脱出してしまいます。 main関数からの脱出 ≒ プログラムの終了 なので、ループが一周目で終わっちゃいますね。
tunt

2018/08/24 08:49

なるほど、承知しました。 ループを重点的に復習したいと思います。 ありがとうございます。
guest

0

C

1 for (j = 0; j < wlen; j++) 2 { 3 printf("%c", argv[i][j]); 4 }

ですね。printfの使いか方の他、jを2回インクリメントしている、謎のreturn、という問題があります。

投稿2018/08/24 07:52

otn

総合スコア84505

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

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

tunt

2018/08/24 08:20

回答ありがとうございます。 ご指摘いただいたところは理解が足りていなかったようなので理解しなおしておきます。 上記に修正し、実行しなおしたのですが、下記のような結果となりました。 出力↓ 確認用:引数の総個数 = 4 abc 123 def c z・xz0 x歸Pidi t i v e s . d l l i・jk0ミ馗ィリ馗 上記内容出力後「while (s[len])」の行にエラー↓ 例外がスローされました:読み取りアクセス違反。 s が 0x1110114 でした。
tunt

2018/08/24 08:44

上記の問題ですが、for文の中を wlen = str_length(argv[i]); に修正したところ、問題なく出力されました 修正後のコードは下記となります。 ご指摘などあればお願い致します。 ご協力ありがとうございました ~~ int str_length(char s[]) { int len = 0; while (s[len]) len++; return len; } int main(int argc, char *argv[]) { /* ※コマンドライン引数が「abc 123 def」の場合 [0] [1] [2] [3] [4] ... argv[1] a b c \0 argv[2] 1 2 3 \0 argv[3] d e f \0 . . . */ int i; int j = 0; int wlen; printf("確認用:引数の総個数 = %d\n", argc); for (i = 1; i < argc; i++) { wlen = str_length(argv[i]); for (j = 0; j < wlen; j++) { printf("%c", argv[i][j]); } } getchar(); return 0; } ~~
guest

0

c

1#include <stdio.h> 2#include <string.h> 3 4int main(int argc, char *argv[]) { 5 char str[BUFSIZ] = ""; 6 for (int i = 1; i < argc; i++) { 7 strncat(str, argv[i], BUFSIZ - 1); 8 } 9 printf("%s\n", str); 10}

参考情報

  • 【C言語】文字列を連結する【危険なstrcatと安全なsnprintf関数による文字列結合】

http://marycore.jp/prog/c-lang/concat-c-string/

投稿2018/08/24 21:55

katoy

総合スコア22324

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

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

tunt

2018/08/27 00:09

返信が遅くなり申し訳ありません。 標準関数を使ったパターンの回答、ありがとうございます。 参考URLまで・・・ 参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問