ページ 11

char型の自作関数について

Posted: 2014年12月16日(火) 21:30
by トト

コード:

#include <stdio.h>

int test(char *,char *);

int main()
{
	char *str = "test";
	char str2[256];
	int i;

	i = test(str,str2);

	printf("%s (%d)byte",str2,i);

	return 0;
}

int test(char *s,char *buf)
{
	sprintf(buf,"文字列「%s」を受け取りました。",s);

	return strlen(buf);;
}
現在このようにint型の関数にし、文字列を処理したあと、結果のバイト数を返しています。
本来は
char test(char *s)
{
処理
return buf;
}
のように引数と戻り値に文字列を使いたいのですが、
この場合はどのように関数を作ればいいのですか?

Re: char型の自作関数について

Posted: 2014年12月16日(火) 21:36
by h2so5
C言語には文字列型はないので、文字列を戻り値で返すことはできません。

Re: char型の自作関数について

Posted: 2014年12月16日(火) 21:38
by トト
h2so5 さんが書きました:C言語には文字列型はないので、文字列を戻り値で返すことはできません。
では、今のやり方しかないのですか?

Re: char型の自作関数について

Posted: 2014年12月16日(火) 21:43
by みけCAT
例えば、test関数内で領域をmallocなどで動的確保し、その領域へのポインタを返す、などでしょうか?
もう一度その関数を呼び出すと上書きされる可能性があることに気をつければ、static変数へのポインタでもいいでしょう。

ただし
トト さんが書きました:本来は
char test(char *s)
{
処理
return buf;
}
のように引数と戻り値に文字列を使いたいのですが、
この場合はどのように関数を作ればいいのですか?
というのは、「戻り値に文字列を使いたい」と言っているのに、
C言語のcharには文字列を格納できないので、矛盾しており、普通の方法では不可能です。
charを文字列を格納できる型(構造体など)にマクロ定義(typedefではなく#define)すればできるかもしれません。

Re: char型の自作関数について

Posted: 2014年12月16日(火) 22:06
by 超初級者
やりたいのはこんなことですか?

コード:

#include <stdio.h>
#include <string.h>

char *test(char *s)
{
   static char buf[40];        // 大きさは、引数の文字列を十分格納できること
   int i;

   for (i = 0; i < strlen(s); i++) {
       buf[i] = s[strlen(s) - i - 1];
   }
   buf[i] = '\0';
   return buf;
}

int main(void)
{
   char s[] = "abcde";

   printf("%s\n", test(s));
   return 0;
}