- ベストアンサー
複数の戻り値を得る方法
- 関数にポインタを渡して、結果を格納してもらう方法で複数の戻り値を得ることができます。
- 例えば、関数の引数にポインタを渡し、関数内でそのポインタに結果を格納することで、複数の値を取得することができます。
- 具体的なコード例として、関数checkでは整数値aを受け取り、ポインタbとcに結果を格納しています。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こうかな? #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; } }
その他の回答 (6)
- asuncion
- ベストアンサー率33% (2127/6289)
>そのことについては迷ったのですが、 >default(それ以外)になることはないから書かなくてもいいかな? それで、本題である、check() にポインターへのポインターを渡すことは 理解されたのですか?
補足
はい、皆さんのおかげで文字列のポインターを渡して返していただける方法がわかりました 基本的なポインタの理解のためにたくさんの方のアドバイスを頂き皆様ありがとうございました
- asuncion
- ベストアンサー率33% (2127/6289)
case 4: *b = "4:×\n"; *c = "4:○\n"; break; ここの後ろに、念のため default: break; を書いておく方がよさそうですね。
補足
そのことについては迷ったのですが、default(それ以外)になることはないから書かなくてもいいかな? と思って省略しました 絶対にかく必要もなかったので
- asuncion
- ベストアンサー率33% (2127/6289)
>まずはポインタについてきちんと理解しましょう。 それは#1さんご自身かと。
- asuncion
- ベストアンサー率33% (2127/6289)
>#1さん >char *b,*c; >まず、これはいけません。 >変数bとcは*を外します。 それはいけません。 char b, c; なんて書くと、それぞれ「1バイトしか」領域を確保できませんね。
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"; } このようになるかと思います。
お礼
ベストアンサーについては2さんにするか3さんにするか迷いました 2さんは技術の解説していただけたのは非常に分かりやすかったのですが 3さんは私が理解できてるのかな?こういうのを付け加えてみたらどうかな? っと大変気にかけていただいたので(未熟者ですみません。もしかしたら、また別の質問で回答をしていただけるかもしtrませんね)心理的な働きも加わり3さんの回答をベストアンサーにしました 2さんのことも評価してたので2さんが悪いわけではないです また何かの質問で会ったらよろしくお願いしますね
補足
<int型のポインタを使用して値を帰す関数の場合、 int型の場合はまさしく解説書どおりですね <<void check( int a, char** b, char** c ) 文字列の場合そうするのですかありがとうございます 早速試してみますね
- gussan_2011
- ベストアンサー率25% (1/4)
char *b,*c; まず、これはいけません。 変数bとcは*を外します。 check(a,b,c); → check(a,&b,&c); としましょう。 check関数内では bとcは*b、*cとします。 例) *b=文字列; *c=文字列; ※文字列の代入は、ご質問の書き方だとダメかと思いますが、割愛します。 サクッと直す部分書きましたが、 まずはポインタについてきちんと理解しましょう。
補足
例題とかではそれなりに理解してるようなきもするのですが、何故か実際にこういうもの作ろうとなったらうまくいかないのですよね 書いたらたまたまうまくいったこともありますが どちらにせよポインタについてはもう少し理解したほうがいいのは自覚していますが 教えていただきありがとうございました
補足
わざわざソースを書いていただきありがとうございます 大変うれしいです NULLもわざわざ追加していただけたのですね 丁寧ですね