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

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

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

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

C

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

1729閲覧

多次元配列とポインター

frypan

総合スコア8

char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

C

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

1クリップ

投稿2017/10/03 06:10

char配列を関数に渡して出力したかったのですが、ポインタが違うアドレスを指し示しているみたいで出力結果が毎回変わります。
char配列aの2行目の先頭アドレスを関数の仮引数に渡して、char配列aの2行目に入った5個の'b'を出力する方法を教えてください。

gcc version 4.6.3

c

1#include <stdio.h> 2 3int main(void){ 4 size_t max=10; 5 char a[5][max+1]; 6 for(size_t i=0;i<5;i++){ 7 a[2][i]='b'; 8 } 9 func(max,a[2]); 10 return 0; 11} 12 13void func(size_t max,char (*str)[max]){ 14 size_t j=0; 15 while(j<5){ 16 printf("%c\n",str+j); 17 j++; 18 } 19}

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

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

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

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

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

guest

回答2

0

ベストアンサー

『二次元配列の二行目』は一次元配列なので、受け取り方が違います。
動作が期待通りかは分かりませんが、次のようにすればコンパイル及び実行できます。

C

1#include <stdio.h> 2 3void func(size_t, char *); 4 5int main(void){ 6 size_t max=10; 7 char a[5][max+1]; 8 for(size_t i=0;i<5;i++){ 9 a[2][i]='b'; 10 } 11 a[2][5] = '\0'; 12 func(max,a[2]); 13 return 0; 14} 15 16void func(size_t max,char *str){ 17 size_t j=0; 18 while(j<5){ 19 printf("%c\n", str[j]); 20 j++; 21 } 22 printf("%s\n", str); 23}

実行結果

b b b b b bbbbb

他に修正すべきだったところ
・funcのプロトタイプ宣言の追加
・文字配列の終端にヌル文字を追加
func内でのstrの参照方法の変更
・ついでに文字列としても出力してみた


特に上記の三行目(太字)は要注意です。この部分ですね。

C

1printf("%c\n",str+j);

strに格納されているのはアドレスなので、%cで出力すると想定外の結果となります。
ちゃんと指し示すデータを参照する必要があります。

C

1printf("%c\n", *(str+j));

これは、次のようにも書くことができます。

C

1printf("%c\n", str[j]);

こっちの方が配列で慣れ親しんでいる分直感的ですね。

ついでに

以下の三つはいずれも正解。

C

1for(size_t j = 0; j<5; j++){ 2 printf("%c\n", str[j]); 3}

C

1for(size_t j = 0; str[j] != '\0'; j++){ 2 printf("%c\n", str[j]); 3}

C

1for(char *tmp = str; *tmp != '\0'; tmp++){ 2 printf("%c\n", *tmp); 3}

文字列がヌル終端していることが前提ですが。

投稿2017/10/03 06:34

編集2017/10/03 06:49
LouiS0616

総合スコア35658

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

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

frypan

2017/10/03 07:25

ありがとうございます。 教えていただいた方法で'b'を5個出力することができました。
guest

0

配列の2番目を渡す。

c

1#include <stdio.h> 2 3// 4//char配列aの2行目の先頭アドレスを関数の仮引数に渡して、 5//char配列aの2行目に入った5個の'b'を出力する方法 6// 7 8void func(size_t max, char str[max]){ 9 size_t j=0; 10 while(j<5){ 11 printf("%c\n",str[j]); 12 j++; 13 } 14} 15 16int main(void){ 17 size_t max=10; 18 char a[5][max+1]; 19 size_t i; 20 for(i=0;i<5;i++){ 21 a[2][i]='b'; 22 } 23 func(max,a[2]); 24 return 0; 25}

c

1void func(char *str){ 2 size_t j=0; 3 while(j<5){ 4 printf("%c\n",*(str+j)); 5 j++; 6 } 7} 8 9int main(void){ 10 size_t max=10; 11 char a[5][max+1]; 12 size_t i; 13 for(i=0;i<5;i++){ 14 a[2][i]='b'; 15 } 16 func((char *)&a[2]); 17 return 0; 18}

投稿2017/10/03 06:57

編集2017/10/03 07:05
A.Ichi

総合スコア4070

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

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

frypan

2017/10/03 07:33

無事解決しました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問