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

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

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

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

365閲覧

C言語の配列について教えていただきたいです。

jump110

総合スコア10

C

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/04/14 05:10

配列sの要素を配列tに代入したいと考えています。
自分はfor文を使って代入しようとしたのですが表示される数字が[111][222][333]ではなく
7,8桁くらいの数字が出てきていしまいます。
for文を抜いて代入せずに配列sだけを表示しても同じ現象が起きてしまいます
線の引いたint k;より下の部分を考えて書きなさいという課題なのでfor文のところで解決しないといけないのですがなかなかうまくいかないので教えていただけると助かります。
エラーメッセージなどは出ていません。

#include <stdio.h>
typedef struct {
char v[4];
}STR;

int main(void){
STR s[3] = {
{"111"},{"222"},{"333"}
};
STR t[3];
int k;


for(k=0;k<3;k++){
t[k] = s[k];
printf("%d\n",t[k]);
};


return 0;
};

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

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

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

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

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

guest

回答2

0

ベストアンサー

c

1printf("%d\n",t[k]);
  • 表示したいものは文字列なので、%d ではない別のものを使う必要があります。
  • t[k]は文字列ではなく構造体なので、t[k]の中の文字列の先頭を指定する必要があります。

投稿2021/04/14 05:32

int32_t

総合スコア20884

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

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

0

課題だということなので、ヒントです。

配列宣言されている、S と t は、char 宣言されています。

そこに、文字列として 111 / 222 / 333 が初期値として代入されています。

printf("%d\n",t[k]]);

の部分は、t[k] が数値であると思って表示しているので、ポインタアドレス(7-8桁の数字)が表示されてしまっています。

printf の 修飾子を調べて、文字列を表示するようにすれば、問題は解決に近づくと思います。

投稿2021/04/14 05:19

nfox

総合スコア229

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

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

jump110

2021/04/14 06:07

ヒントありがとうございます! 修飾子について調べて文字列なので"%s"とするところまではできたのですが実行してみると Runtime error(Exit status:139(Invalid memory reference)) 上記のようなエラーが出てしまいました。
kaina

2021/04/14 06:46

以下の箇所も見直しが必要です。 t[k] = s[k]; C言語では文字列のコピーは変数と変数を=で代入することが出来ません。 「c言語 文字列 代入」等のキーワードで調べてみましょう。 後、構造体の要素vの内容をコピーしないといけないので、その部分も考慮する必要があります。
jump110

2021/04/14 07:17 編集

文字列の代入について調べてみると「strcpy」というのが出てきたのですがこれだと一括で置き換えてしまうのでfor文を使うことが出来ないようなのですがなにか解決策はありますでしょうか。 for(k=0;k<3;k++){ STR[k].t= STR[k].s このような形のものも発見したのですがエラーが出てしまいうまくいきませんでした
int32_t

2021/04/14 07:19

t[k] = s[k]; は問題ありません。そのままで大丈夫です。
jump110

2021/04/14 07:27

このままだとRuntime error(Exit status:139(Invalid memory reference))というエラーが出てしまいます...
kaina

2021/04/14 07:28

すいません大嘘付いてしまいました。 t[k].vまで指定して代入する場合はstrcpy等を使用する必要があります。 今回のケースではint32_tさんの指摘通りそのままで問題ありません。 int32_tさんの回答にある「t[k]の中の文字列の先頭を指定する」必要がありますね。
jump110

2021/04/14 07:39

みなさん何度も返信ありがとうございます。 たくさん質問してしまいすみません。 「文字列の先頭を指定する」について調べてみたのですがピンとくるものが見当たらないのですが具体的に教えていただいてもよろしいですか?
int32_t

2021/04/14 07:50 編集

「構造体のメンバーにアクセスする方法」とか課題を出した方から教わっていませんか。 教わってなくても↑のキーワードで検索すれば出てくるかと。
jump110

2021/04/14 08:20

t[k]=s[k];からt[k].v=s[k].vにするということでしょうか...
int32_t

2021/04/14 08:27

その行に問題はありません。printf()の行だけ直せばいいはずです。
jump110

2021/04/14 08:31

できました!!!!!ありがとうございます!!!!!
jump110

2021/04/14 08:31

何度も教えてくださりありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問