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

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

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

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

関数

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

Q&A

解決済

3回答

1955閲覧

C言語で2次元文字列配列を関数から返す方法

minwinmin

総合スコア16

C

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

関数

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

0グッド

1クリップ

投稿2020/10/04 10:58

実現したいこと

  1. 2次元の文字列配列を引数としてreturn_string関数に渡す。
  2. その先で配列に文字列を代入
  3. main関数に返す

といった上記のことを実現したいと考えています。
main関数にどうすれば、代入した文字列配列をかえすことができるのでしょうか?
下記のようなプログラムで試しているのですが、main関数内で

for(int i = 0; i < n; i++){ printf("%s\n", &ap[i]); ptr++; }

とすれば値が表示されると考えたのですが、うまく表示されませんでした。

プログラム

#include <stdio.h> void return_string(int n, char **ptr); int main(void){ int num = 3; char *ap[3] = {}; return_string(num, ap); //printf("%s\n", &ap); } void return_string(int n, char **ptr) { int i; char a[3][11] = {"1111111","2222222","3333333"}; for(i = 0; i < n; i++){ *ptr = &a[i]; //printf("%s\n", *ptr); ptr++; } }

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

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

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

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

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

guest

回答3

0

2次元の文字列配列を引数としてreturn_string関数に渡す。
と言いながら

char *ap[3] = {}; return_string(num, ap);

とコードは違いますね。
return_string() 内の文字列に main() 内でアクセスしたいのであれば
提示されたコードを尊重して修正すると以下ですね。

// char a[3][11] = { "1111111","2222222","3333333" }; static char a[3][11] = { "1111111","2222222","3333333" }; //*ptr = &a[i]; *ptr = a[i]; //for(int i = 0; i < n; i++){ // printf("%s\n", &ap[i]); // ptr++; //} for (int i = 0; i < 3; i++) { printf("%s\n", ap[i]); }

投稿2020/10/04 11:42

lehshell

総合スコア1147

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

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

0

2次元の文字列配列を引数として
char *ap[3] = {};

まずここから違います。
これはchar型ポインタの1次元配列です。
つまり配列にどこかに確保したそれぞれの文字列の先頭アドレスを返却してもらうことを目的としないといけません。
という前提であれば以下の構文は正しいです。

*ptr = &a[i];

ただ、

char a[3][11] = {"1111111","2222222","3333333"};

これはローカル変数なのでreturn_string関数を抜けた時点で失われる領域に格納されています。
(実際には失われないかもしれませんが、必ず残っているという保証はできません)
よってmain関数でreturn_string関数内a変数を参照したいのであれば、aをstatic変数として静的メモリに格納してあげればよいでしょう。

static char a[3][11] = {"1111111","2222222","3333333"};

投稿2020/10/05 00:12

ttyp03

総合スコア16998

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

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

0

ベストアンサー

char a[3][11] = {"1111111","2222222","3333333"};

これ、 return_strig()の中でしか、有効でありません。(ローカル変数は、その関数内のみ)

main()内で、
char *ap[3] = {}; --> char ap[3][11]; にして領域を確保して、(この領域も main()内だけです) return_string() に渡し、この領域にコピーですね。
strcpy(ptr[i], a[i]);
あたりでしょうか。

そのまま、直すとこんな感じ?

C

1void return_string(int n, char ptr[3][11]); 2 3int main(void){ 4 int i, num = 3; 5 //char *ap[3] = {}; 6 char ap[3][11]; 7 8 return_string(num, ap); 9 //printf("%s\n", &ap); 10} 11 12//void return_string(int n, char **ptr) 13void return_string(int n, char ptr[3][11]) 14{ 15 int i; 16 char a[3][11] = {"1111111","2222222","3333333"}; 17 18 for(i = 0; i < n; i++){ 19 strcpy(ptr[i], a[i]); 20 //printf("%s\n", *ptr); 21 } 22}

投稿2020/10/04 11:37

編集2020/10/04 11:43
pepperleaf

総合スコア6383

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

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

minwinmin

2020/10/06 01:46

こちら、とても直感的にわかりやすかったです。 実現したい動作が実現できました。 大変ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問