ページ 1 / 1
初歩的な質問ですが...
Posted: 2012年10月19日(金) 23:33
by kw
Cの初歩的な質問かもしれませんが、
Aという関数でキーボードから入力して文字列aに入れて返し、その戻り値aをmainの文字列bに入れたいのですが、うまくいきません。
どうすればよろしいでしょうか?
Re: 初歩的な質問ですが...
Posted: 2012年10月19日(金) 23:54
by softya(ソフト屋)
フォーラルムールをお読み頂けますか? テンプレートを使って書き込んでいただくのが良いと思います。
http://dixq.net/board/board.html
Re: 初歩的な質問ですが...
Posted: 2012年10月20日(土) 00:14
by kw
抽象的な質問ですみませんでした。
下のプログラムをubuntuのターミナルで実行すると、
警告: 関数が局所変数のアドレスを返します [デフォルトで有効]
と表示されます。
エラーの意味がよく分からないので教えていただきたいです。
コード:
#include <stdio.h>
char *A(void)
{
char a[256];
fgets(a, sizeof(a), stdin);
return a;
}
int main(void)
{
int i;
char *b[10];
for(i = 0; i < 10; i++)
b[i] = A();
return 0;
}
Re: 初歩的な質問ですが...
Posted: 2012年10月20日(土) 00:53
by softya(ソフト屋)
char a[256];は局所変数(ローカル変数)ですので、戻り値にすることはできません。
なぜなら関数Aから抜けると配列aは消滅するからです。
それと
char *b[10];
は文字型ポインタのポインタが10個ならんだ配列ですので、文字列を10個覚えることができます。
文字列が10個欲しいわけではないですよね?
命題の
>Aという関数でキーボードから入力して文字列aに入れて返し、その戻り値aをmainの文字列bに入れたいのですが
これを実現するためには戻り値に文字列を戻したいことなりますが、C言語ではmallocなどでaを動的確保しないと出来ないことになります。
【補足】
ココらへんをどう解決するかはkwさんの知識量によって左右されます。なので詳しい情報がほしいのです。
Re: 初歩的な質問ですが...
Posted: 2012年10月20日(土) 16:23
by ホヅミ
ソフト屋さんに次いでさらにヒント
scanf("%c",&ch);
アドレス渡し
ここらあたりで調べると幸せになれますよ
Re: 初歩的な質問ですが...
Posted: 2012年10月21日(日) 21:14
by Dixq (管理人)
2種類のサンプルを書いてみました。
1. GetStdinStr1
引数で渡すこと無しに、関数が char* を返すなら、関数内でメモリアロケートする必要があります。
関数内でメモリをアロケートして、その中に文字列を入れて返します。
その代り、受け取った後にfreeする必要があります。
2. GetStdinStr2
freeしなくて済むようにするなら、main側で確保した配列を渡してやり、関数内で格納してやると良いでしょう。
ただこれなら関数化する意味があまりありませんが・・。
コード:
#include <stdio.h>
#include <stdlib.h>
char *GetStdinStr1(int Len){
char *p = (char*)malloc(Len);
fgets(p, Len, stdin);
return p;
}
void GetStdinStr2(char *p, int Len){
fgets(p, Len, stdin);
}
int main(){
char* str1 = GetStdinStr1(256);
char str2[256];
GetStdinStr2(str2, 256);
printf("%s", str1);
printf("%s", str2);
free(str1);
return 0;
}