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

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

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

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

Q&A

3回答

798閲覧

配列の数値を条件を指定して文字に置き換えたいがエラーになります

gyoruo

総合スコア61

C

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

0グッド

0クリップ

投稿2020/07/05 01:43

編集2020/07/05 01:51

1の場合は$で2の場合は{ }に置き換えたいのですがうまくいきません。
コアダンプとよくわからないエラーが発生しています。数値を文字列に置き換えているのでnum_p[3][4]ではなくnum_p[][]としてもうまくいきません。
解決策などありましたらアドバイス等をお願い致します。

C

1#include <stdio.h> 2int main() 3{ 4 char num[3][4] = {{1, 2, 3, 4},{1, 3, 2, 4},{4, 3, 1, 2}}; 5 char *num_p[3][4]; 6 int i, j; 7 8 num_p[3][4] = &num[0][0]; 9 10 for (i = 0; i < 3; i++) { 11 for (j = 0; j < 4; j++) { 12 printf("%5d", *num_p[i][j]); 13 if (*num_p[i][j] == 1) { 14 *num_p[i][j] = "$"; 15 } else if (*num_p[i][j] == 2) { 16 *num_p[i][j] = "{ }"; 17 } 18 } 19 printf("\n"); 20 } 21 22 return 0; 23} 24 25

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

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

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

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

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

cateye

2020/07/05 01:54

エラーメッセージは、そのまま(加工などせずに)貼り付けて下さい、
gyoruo

2020/07/05 01:58

配列に何も指定しない場合は array has incomplete element type 'char *[]' char *num_p[][]; ^ test.c:17:9: error: expected expression num_p[][] = &num[0][0]; ^ test.c:17:11: error: expected expression num_p[][] = &num[0][0]; が表示され、配列の大きさをこちらで指定した場合は test.c:23:22: warning: incompatible pointer to integer conversion assigning to 'char' from 'char [2]' [-Wint-conversion] *num_p[i][j] = "$"; ^ ~~~ test.c:25:22: warning: incompatible pointer to integer conversion assigning to 'char' from 'char [6]' [-Wint-conversion] *num_p[i][j] = "{ }"; ^ ~~~~~~ test.c:17:3: warning: array index 4 is past the end of the array (which contains 4 elements) [-Warray-bounds] num_p[3][4] = &num[0][0]; ^ ~ test.c:14:3: note: array 'num_p' declared here char *num_p[3][4]; ^ test.c:17:3: warning: array index 3 is past the end of the array (which contains 3 elements) [-Warray-bounds] num_p[3][4] = &num[0][0]; ^ ~ test.c:14:3: note: array 'num_p' declared here char *num_p[3][4]; のような注意喚起が表示され、実行するとzsh: segmentation fault ./a.outと表示されます。
guest

回答3

0

文字の配列の要素は「ひとつの文字」なので、文字列は設定できません。

とりあえず、ポインター変数をchar *num_p;にして、num_pを使う場面では[]の類を全部取り、内側のループでnum_p++で位置をずらしつつ、"$"'$'に、"{ }"は(1文字しか設定できないので)'{'にすれば、「配列の数値を文字に置き換える」というプログラムにはなりますね。

ついでに、元のコードだと、置き換えた後の状態を確認できないので、printfの位置を後ろに移動。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 char num[3][4] = {{1, 2, 3, 4}, {1, 3, 2, 4}, {4, 3, 1, 2}}; 6 char *num_p; 7 8 num_p = &num[0][0]; 9 10 for (int i = 0; i < 3; i++) { 11 for (int j = 0; j < 4; j++) { 12 if (*num_p == 1) { 13 *num_p = '$'; 14 } else if (*num_p == 2) { 15 *num_p = '{'; 16 } 17 printf("%5d", *num_p); 18 num_p++; 19 } 20 printf("\n"); 21 } 22 23 return 0; 24}

投稿2020/07/05 02:18

編集2020/07/05 02:21
Daregada

総合スコア11990

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

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

gyoruo

2020/07/05 02:38

ご回答ありがとうございます。 Daregadaさんのプログラムでできたのですが、文字も数値になってしまっていたので修正方法を考えてみます!
Daregada

2020/07/05 03:15

いや、文字もコンピューターの内部では数値ですからね。 表示方法を変えればいいのですが、そうすると 3 や 4 が制御文字(普通に表示できない)になってしまうので、端末画面には文字が表示されないか、おかしな表示になるでしょう。 if (*num_p < ' ') { printf("%5d", *num_p); } else { printf("%5c", *num_p); } とでもしておけばいいのですが。
gyoruo

2020/07/12 08:29

ご回答ありがとうございます! 参考にさせていただきます!
guest

0

text

1usr ~/Project/test % cc t3.c 2t3.c:13:30: error: subscripted value is not an array, pointer, or vector 3 printf("%5d", *num_p[i][j]); 4 ~~~~~~~~^~ 5t3.c:14:20: error: subscripted value is not an array, pointer, or vector 6 if (*num_p[i][j] == 1) { 7 ~~~~~~~~^~ 8t3.c:15:18: error: subscripted value is not an array, pointer, or vector 9 *num_p[i][j] = "$"; 10 ~~~~~~~~^~ 11t3.c:16:27: error: subscripted value is not an array, pointer, or vector 12 } else if (*num_p[i][j] == 2) { 13 ~~~~~~~~^~ 14t3.c:17:18: error: subscripted value is not an array, pointer, or vector 15 *num_p[i][j] = "{ }"; 16 ~~~~~~~~^~ 175 errors generated. 18

num_p = &num[0][0];→*num_p[i][j] ←ポインタの配列ではありません。
文字列 "$"、"{ }"は、アドレスに変換されます。
で、char型の変数に複数の文字("{ }":UTF-8で5バイト)を入れることは出来ません。
・・・cの構文や演算子のを勉強しましょう。

追記:修正してみましたが、num[i][j] = "{ }";の意図が分かりません?
(やりたいことは分かりますが、出来ないのでどうしますか?)
・・・「char1個に半角文字1個しか入らない」は分かっているんですよね?

c

1#include <stdio.h> 2 3int main() 4{ 5 char num[3][4] = {{1, 2, 3, 4},{1, 3, 2, 4},{4, 3, 1, 2}}; 6 char *num_p; 7 int i, j; 8 9 num_p = &num[0][0]; 10 11 for (i = 0; i < 3; i++) { 12 for (j = 0; j < 4; j++) { 13 printf("%5d", num[i][j]); 14 if (num[i][j] == 1) { 15 num[i][j] = '$'; 16 } else if (num[i][j] == 2) { 17 num[i][j] = "{ }"; 18 } 19 } 20 printf("\n"); 21 } 22 23 return 0; 24}

text

1t3.c:17:19: warning: incompatible pointer to integer conversion assigning to 'char' from 'char [6]' [-Wint-conversion] 2 num[i][j] = "{ }"; 3 ^ ~~~~~~ 41 warning generated. 5

投稿2020/07/05 01:57

編集2020/07/05 02:18
cateye

総合スコア6851

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

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

gyoruo

2020/07/05 02:16

ご指摘ありがとうございます! 色々と見直してみます!
gyoruo

2020/07/05 02:32

修正までしていただき、ありがとうございます。 配列1つに"{"しか入らないのは理解しています。 今はどうやって実現しようか考えています。
guest

0

printf("%5d", *num_p[i][j]);

num_p って変数の型みてみよう。
全然違いますがな

投稿2020/07/05 01:45

y_waiwai

総合スコア87749

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

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

gyoruo

2020/07/05 01:53

早急なアドバイスありがとうございます! 次はコアダンプで領域破壊を起こしているらしく、数値を文字列に置き換える時のnum_p[][]の[][]はなぜ空だとエラーになってしまうのでしょうか?
y_waiwai

2020/07/05 02:01

num_p の型をみてください。 ポインタの理解ができていないようなので、まずはそこらへんから勉強し直しましょう。 コードを修正したようですが、これでもだめです。
gyoruo

2020/07/05 02:16

ご指摘ありがとうございます! どこがわからないのかもわからなかったのでありがたいです。 見直してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問