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

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

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

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

Q&A

解決済

3回答

3224閲覧

【C言語】2次元配列のstrcat後のprintfでエラーが出る

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

1クリップ

投稿2017/07/25 03:19

編集2017/07/25 03:37

以下のコードは入力した3つの文字列の先頭それぞれに「AAA」、「BBB」、「CCC」を追加するプログラムです(ただし、「AAA」の追加しかコーディングしていません)。
printfの行でエラーとなっていますが、原因が分かりません。
どうしたら上手く出力できるようになりますか?

#include <stdio.h> #include <string.h> int main() { char input[3][100]; char *gold ="AAA "; char *silver = "BBB "; char *Bronze = "CCC "; for (int i = 0; i < 3; i++) { scanf("%s", &input[i][0]); if (i == 0) { strcat(&gold, &input[i][0]); printf("%s\n", gold); } } return 0; }

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

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

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

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

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

hsk

2017/07/25 03:36

タグが "C#" になっていますよ... "C" ですよね。
退会済みユーザー

退会済みユーザー

2017/07/25 03:37

すいません。修正しました。
guest

回答3

0

やりたいことが、質問の通りなら(失礼、AAA が 前ですね修正しました、ちょっと長くなっちゃいましたけど)

C

1#include <stdio.h> 2#include <string.h> 3 4int main() 5{ 6 char work[100]; 7 char input[3][100]; 8 char *gold ="AAA "; 9 char *silver = "BBB "; 10 char *Bronze = "CCC "; 11 12 for (int i = 0; i < 3; i++) { 13 scanf("%s", &input[i][0]); 14 if (i == 0) { 15 memset(work, 0, sizeof(work)); 16 strcat(work, gold); 17 strcat(work, &input[i][0]); 18 printf("%s\n", work); 19 } 20 } 21 22 return 0; 23}

投稿2017/07/25 04:15

編集2017/07/25 04:32
showkit

総合スコア1638

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

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

退会済みユーザー

退会済みユーザー

2017/07/25 04:17

すいません、それだと「AAA」が後ろで連結されてしまいます。
退会済みユーザー

退会済みユーザー

2017/07/25 04:34

ご回答ありがとうございます。 memsetはなぜ必要なのでしょうか?
showkit

2017/07/25 04:48

例題では、i が 0 のときしか使っていませんが、ループで何回も使うのであれば、初期化しないとどんどん後ろに追加されます。 if (i == 0) と {} を外して実行するとわかると思いますよ。
guest

0

printではコンパイルエラーにはなりませんでしたがstrcatでエラーでした。
strcatの格納先がgoldポインターのアドレスなのでを取るとコンパイルはできますが
goldに空き領域が無いので「セグメンテーション違反」になると思います。

ちょっと変えてみました

c

1int main() 2{ 3 char input[3][100]; 4 char gold[128] = "AAA "; 5 char silver[128] = "BBB "; 6 char Bronze[128] = "CCC "; 7 8 for (int i = 0; i < 3; i++) { 9 scanf("%s", input[i]); 10 if (i == 0) { 11 strcat(gold, input[i]); 12 printf("%s\n", gold); 13 } 14 } 15 return 0; 16}

投稿2017/07/25 04:11

A.Ichi

総合スコア4070

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

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

退会済みユーザー

退会済みユーザー

2017/07/25 04:12

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

0

ベストアンサー

char *gold = "AAA";ですので、goldの指す先は文字列定数であり、書き込めません

goldに追記したいのであれば、char gold[200]= "AAA";のように、追記できるバッファーを用意する必要があります。

投稿2017/07/25 03:59

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2017/07/25 04:03

うまくいきました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問