• ベストアンサー

C言語で文字列操作を忘れてしまいました。

長い間スクリプト言語ばかりやっておりまして、C言語に戻ると、文字列を返す 関数を作ろうとしましたが、お恥ずかしいながらできませんでした。 ローカル変数の値を戻り値に使おうとして、それがwarningになったり、動作が不安定になったりして、文字列を返す仕組みを完全に忘れてしまっていました。 例えば、"test"と言う文字列を返す関数を書きたいのですが、メモリ操作も考えた サンプルをだれか教えて欲しいです。 int main(void) { printf("%s", 「関数名」); }

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

>printf("%s\n", 関数); は、無理があるのでしょうか? 関数の戻り値がポインタであっても問題ありません。 printf("%s","TEST"); も printf("%s", test(hatena)); も printf("%s", XXXX); XXXXの部分が(char*)であれば、問題なく動くはずです。また動かないとおかしいと思います。 もしかしたら、かなり特殊な処理系なのかも知れませんが。 #2のプログラムについては、#3の方の指摘されている通り mallocで+1のサイズが必要 strdupはmallocと同じ mallocで確保したものは、解放してあげないといけない。

その他の回答 (4)

  • yasuch
  • ベストアンサー率41% (27/65)
回答No.4

No.3です。 補足ですが TESTSTR2() の strdup() は、ANSI非互換の関数なので Windows上でしか動きません。 あと、strdup()もメモリをアロケートするので printf("%s\n", p=TESTSTR2()); free(p); としておかないと、メモリリークしますね。

  • yasuch
  • ベストアンサー率41% (27/65)
回答No.3

No.2さんの方法でダメでしたか? 私の環境 MSVC 6.0 では動きましたよ。 TESTSTR3は、少し変更しましたけど #include <stdio.h> #include <string.h> #include <malloc.h> char *TESTSTR1(void){ static char *str="TEST"; return str; } char *TESTSTR2(void){ return strdup("TEST"); } char *TESTSTR3(void){ char *wk="TEST"; return strcpy((char*)malloc(strlen(wk)+1),wk); } int main(int argc, char* argv[]) { char *p; printf("%s\n", TESTSTR1()); printf("%s\n", TESTSTR2()); printf("%s\n", p=TESTSTR3()); free(p); return 0; }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#include <stdio.h> #include <string.h> #include <malloc.h> char *TESTSTR1(void){ static char *str="TEST"; return str; } char *TESTSTR2(void){ return strdup("TEST"); } char *TESTSTR3(void){ char *wk="TEST"; return strcpy((char*)malloc(strlen(wk)),wk); }

kounesi
質問者

補足

以下の方法で動作しました。 文字列のポインタを関数に渡して、相手先の関数内で処理するという方法が簡単で 理解できます。 提示されている例ですが、ポインタを戻り値として返した場合、 正しく表示できるのでしょうか? 試してみましたがうまくいきませんでした。 printf("%s\n", 関数); は、無理があるのでしょうか? void test2(char *buf) { lstrcpy(buf, "結果"); } int main(void) { char buf[256]; test2(buf); printf("%s\n", buf); return 0; }

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

int main(void) { char str[256]; char *pstr; strcpy(str, "kounesi"); strncat(str, "anmochi", 4); pstr = strstr(str, "nesian"); printf("%s\n%s\n", str, pstr); return 0; } こんなのどう? GLIBCでのサンプル。Win32ではまたちょっと違うよね。 memcpy系もあるね。strtokは・・・・使わんか。

関連するQ&A