『二次元配列の二行目』は一次元配列なので、受け取り方が違います。
動作が期待通りかは分かりませんが、次のようにすればコンパイル及び実行できます。
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}
実行結果
他に修正すべきだったところ
・funcのプロトタイプ宣言の追加
・文字配列の終端にヌル文字を追加
・func内でのstrの参照方法の変更
・ついでに文字列としても出力してみた
特に上記の三行目(太字)は要注意です。この部分ですね。
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 07:25