• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数の戻り値)

複数の戻り値を得る方法

このQ&Aのポイント
  • 関数にポインタを渡して、結果を格納してもらう方法で複数の戻り値を得ることができます。
  • 例えば、関数の引数にポインタを渡し、関数内でそのポインタに結果を格納することで、複数の値を取得することができます。
  • 具体的なコード例として、関数checkでは整数値aを受け取り、ポインタbとcに結果を格納しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

こうかな? #include <stdio.h> #include <stdlib.h> void check(int a, char **b, char **c); int main(void) { int a; char *b, *c; int i; char *va[5] = { "2", "3", NULL, NULL, NULL }; for (i = 0; i < 5; i++) { //ここ何とかなったらwhileにしとこ if (va[i] != NULL) { a = atoi(va[i]); check(a, &b, &c); printf("%s%s\n", b, c); } } return 0; } void check(int a, char **b, char **c) { switch (a) { case 0: *b = "0:×\n"; *c = "0:○\n"; break; case 1: *b = "1:×\n"; *c = "1:○\n"; break; case 2: *b = "2:×\n"; *c = "2:○\n"; break; case 3: *b = "3:×\n"; *c = "3:○\n"; break; case 4: *b = "4:×\n"; *c = "4:○\n"; break; } }

nanaka2222
質問者

補足

わざわざソースを書いていただきありがとうございます 大変うれしいです NULLもわざわざ追加していただけたのですね 丁寧ですね

その他の回答 (6)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.7

>そのことについては迷ったのですが、 >default(それ以外)になることはないから書かなくてもいいかな? それで、本題である、check() にポインターへのポインターを渡すことは 理解されたのですか?

nanaka2222
質問者

補足

はい、皆さんのおかげで文字列のポインターを渡して返していただける方法がわかりました 基本的なポインタの理解のためにたくさんの方のアドバイスを頂き皆様ありがとうございました

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.6

case 4: *b = "4:×\n"; *c = "4:○\n"; break; ここの後ろに、念のため default: break; を書いておく方がよさそうですね。

nanaka2222
質問者

補足

そのことについては迷ったのですが、default(それ以外)になることはないから書かなくてもいいかな? と思って省略しました 絶対にかく必要もなかったので

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

>まずはポインタについてきちんと理解しましょう。 それは#1さんご自身かと。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

>#1さん >char *b,*c; >まず、これはいけません。 >変数bとcは*を外します。 それはいけません。 char b, c; なんて書くと、それぞれ「1バイトしか」領域を確保できませんね。

noname#247552
noname#247552
回答No.2

int型のポインタを使用して値を帰す関数の場合、 void func( int* p ) { *p = 10; } として、呼び出す場合は int main(void) { int a; func( &a ); } としたかと思います。 文字列の場合は普通に代入する場合は、 char* c; c = "文字列"; などとしたと思います。 この文字列の代入を先ほどのint型を使った関数に直すと、 「char*」型の値をポインタを使って受け取りたい…つまり、「char*」型を示すポインタが必要になります。 「char」型のポインタのポインタをいうことになります。 ですから、書きなおすと、 int main( void ) { int a; char *b,*c; int i; char *va[5]={"2","3"}; for(i=0;i<5;i++){//ここ何とかなったらwhileにしとこ if(va[i]!=NULL){ a=atoi(va[i]); check(a,&b,&c); //↑ポインタ変数のポインタを取り出す printf("%s%s\n",b,c); } } } そして、check関数ですが、一部省略しますが、 //↓ charのポインタのポインタだから*が2つ void check( int a, char** b, char** c ) { *b = "文字列1\n"; *c = "文字列2\n"; } このようになるかと思います。

nanaka2222
質問者

お礼

ベストアンサーについては2さんにするか3さんにするか迷いました 2さんは技術の解説していただけたのは非常に分かりやすかったのですが 3さんは私が理解できてるのかな?こういうのを付け加えてみたらどうかな? っと大変気にかけていただいたので(未熟者ですみません。もしかしたら、また別の質問で回答をしていただけるかもしtrませんね)心理的な働きも加わり3さんの回答をベストアンサーにしました 2さんのことも評価してたので2さんが悪いわけではないです また何かの質問で会ったらよろしくお願いしますね

nanaka2222
質問者

補足

<int型のポインタを使用して値を帰す関数の場合、 int型の場合はまさしく解説書どおりですね <<void check( int a, char** b, char** c ) 文字列の場合そうするのですかありがとうございます 早速試してみますね

回答No.1

char *b,*c; まず、これはいけません。 変数bとcは*を外します。 check(a,b,c); → check(a,&b,&c); としましょう。 check関数内では bとcは*b、*cとします。 例) *b=文字列; *c=文字列;  ※文字列の代入は、ご質問の書き方だとダメかと思いますが、割愛します。 サクッと直す部分書きましたが、 まずはポインタについてきちんと理解しましょう。

nanaka2222
質問者

補足

例題とかではそれなりに理解してるようなきもするのですが、何故か実際にこういうもの作ろうとなったらうまくいかないのですよね 書いたらたまたまうまくいったこともありますが どちらにせよポインタについてはもう少し理解したほうがいいのは自覚していますが 教えていただきありがとうございました

関連するQ&A