質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

3回答

1444閲覧

Cで文字列をreturnしたい

do31

総合スコア45

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2020/04/12 07:23

C言語でファイル読み込み後にファイル内容をreturnしたいのですが、意図通りとなりません。
mainからfile_readを呼び出してcontentsに内容を詰めています。
file_read中のcontentsの内容はファイル内容が設定されています。
mainに戻ってきたときにNULLとなっています。
どのように変更すればよいのでしょうか。

int file_read(char *input, char *contents) { // ファイルをオープン FILE *fp; errno_t err = fopen_s(&fp, input, "r"); if (err != 0) { printf("file open error."); return 1; } // サイズ取得 fseek(fp, 0, SEEK_END); size_t file_size = ftell(fp); fseek(fp, 0, SEEK_SET); // メモリ割り当て if ((contents = (char *)malloc(file_size)) == NULL) { printf("malloc error.\n"); fclose(fp); return 1; } // 読み込み char c; int i = 0; while ((c = fgetc(fp)) != EOF) { contents[i++] = c; } contents[i] = '\0'; // クローズ fclose(fp); } int main(void) { // ファイルを読み込みます。 char *contents = NULL; char input_path[] = "D:/work/test.txt"; file_read(input_path, contents); printf("%s", contents); // 終了処理 free(contents); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/04/12 09:03 編集

質問への回答ではないのでコメントのみですが、ファイルサイズ分mallocで確保したバッファで、末端の'\0'を確保したサイズ+1の位置へ格納しています。malloc(file_size + 1)とすべきかと思います。
do31

2020/05/07 13:00

ありがとうございます。 デバッグ中に気づき修正しました・・・
guest

回答3

0

C言語で関数の仮引数は実引数の値のコピーでしかないので
関数内で仮引数を書き換えても実引数は変更されません。

そのため

c

1int file_read(char *input, char **contents_ptr){ // 案A 2 char* contents = NULL; 3 // 略 4 // メモリ割り当て 5 if ((contents = *contents_ptr = (char *)malloc(file_size)) == NULL) 6 // 略 7} 8char* file_read(char *input){ // 案B 9 char* contents = NULL; 10 // 略 11 return contents; 12}

どちらかを選択することになるかと思います。

投稿2020/04/12 07:36

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

do31

2020/04/12 09:10

ありがとうございます。
guest

0

ベストアンサー

C

1int file_read(char *input, char **contents_ptr) { /* 変更 */ 2 ... 3 // メモリ割り当て 4 char* contents; /* 追加 */ 5 if ((contents = (char *)malloc(file_size)) == NULL) { 6 printf("malloc error.\n"); 7 fclose(fp); 8 return 1; 9 } 10 11 // 読み込み 12 char c; 13 int i = 0; 14 while ((c = fgetc(fp)) != EOF) { 15 contents[i++] = c; 16 } 17 contents[i] = '\0'; 18 *contents_ptr = contents; /* 追加 */ 19... 20 // クローズ 21 fclose(fp); 22 return 0; 23} 24 25int main(void) 26{ 27 // ファイルを読み込みます。 28 char *contents = NULL; 29 char input_path[] = "D:/work/test.txt"; 30 file_read(input_path, &contents); /* &追加 */ 31 32 printf("%s", contents); 33 34 // 終了処理 35 free(contents); 36 return 0; 37}

投稿2020/04/12 07:31

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

do31

2020/04/12 09:08

具体的なコードありがとうございます。
guest

0

contents = malloc()のように代入していますが、ポインタそのものは値渡しなので、呼び出した側のcontentsに値が渡されることはありません。

ポインタを返り値にするか、char **とポインタのポインタを使ってポインタ自体を書き換えるなど、別な手段が必要となります。

投稿2020/04/12 07:29

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

do31

2020/04/12 09:00

>ポインタそのものは値渡し なるほど。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問