初歩的な質問ですが...

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kw

初歩的な質問ですが...

#1

投稿記事 by kw » 7年前

Cの初歩的な質問かもしれませんが、
Aという関数でキーボードから入力して文字列aに入れて返し、その戻り値aをmainの文字列bに入れたいのですが、うまくいきません。
どうすればよろしいでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 初歩的な質問ですが...

#2

投稿記事 by softya(ソフト屋) » 7年前

フォーラルムールをお読み頂けますか? テンプレートを使って書き込んでいただくのが良いと思います。
http://dixq.net/board/board.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kw

Re: 初歩的な質問ですが...

#3

投稿記事 by kw » 7年前

抽象的な質問ですみませんでした。

下のプログラムを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;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 初歩的な質問ですが...

#4

投稿記事 by softya(ソフト屋) » 7年前

char a[256];は局所変数(ローカル変数)ですので、戻り値にすることはできません。
なぜなら関数Aから抜けると配列aは消滅するからです。

それと
char *b[10];
は文字型ポインタのポインタが10個ならんだ配列ですので、文字列を10個覚えることができます。
文字列が10個欲しいわけではないですよね?

命題の
>Aという関数でキーボードから入力して文字列aに入れて返し、その戻り値aをmainの文字列bに入れたいのですが
これを実現するためには戻り値に文字列を戻したいことなりますが、C言語ではmallocなどでaを動的確保しないと出来ないことになります。

【補足】
ココらへんをどう解決するかはkwさんの知識量によって左右されます。なので詳しい情報がほしいのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ホヅミ
記事: 110
登録日時: 9年前

Re: 初歩的な質問ですが...

#5

投稿記事 by ホヅミ » 7年前

ソフト屋さんに次いでさらにヒント
scanf("%c",&ch);
アドレス渡し
ここらあたりで調べると幸せになれますよ

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: 初歩的な質問ですが...

#6

投稿記事 by Dixq (管理人) » 7年前

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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る