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

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

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

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

Q&A

解決済

3回答

1454閲覧

C言語:引数で渡した文字列リテラルに文字をコピーしたい

Ykkykk

総合スコア140

C

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

0グッド

0クリップ

投稿2020/06/03 03:46

以下のようなコードを作成したのですが、引数に渡したバッファに文字列をコピーすることができません。。。
NULLが返ってきてしまうのですが、このように引数にアドレスを渡してそこに値を書き込んで返してもらうような処理はどのように修正すればよいでしょうか。

ご教示くださいますと幸いです。よろしくお願いいたします。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5int copy(char *buf) 6{ 7 char *src = "TEST\n"; 8 buf = (char *)malloc(24); 9 memset(buf, 0, 20); 10 sprintf(buf, "%s", src); 11 return 0; 12} 13 14int main(void) 15{ 16 char *dst; 17 int ret; 18 19 ret = copy(dst); 20 printf("%s", dst); 21 free(dst); 22 23 return 0; 24}

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

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

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

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

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

guest

回答3

0

僕ならこうする:

C

1#define _CRT_SECURE_NO_WARNINGS /* disable warning for VC++ */ 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5 6char* copy(const char* src) { 7 char* buf = (char*)malloc(strlen(src)+1); 8 if ( buf != NULL ) { 9 strcpy(buf, src); 10 } 11 return buf; 12} 13 14int main(void) { 15 char* dst = copy("TEST"); 16 printf("%s", dst); 17 free(dst); 18 19 return 0; 20}

投稿2020/06/03 04:11

episteme

総合スコア16612

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

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

Ykkykk

2020/06/03 04:21

ご回答ありがとうございます。 確かにコピーするだけなら頂いたご回答の方が圧倒的にスマートですね。。。 大変勉強になりました。ありがとうございます!
Ykkykk

2020/06/03 04:28

そうだったのですね。わざわざお教えくださりありがとうございます。。。 大変勉強になります!
guest

0

ベストアンサー

呼び出し先で領域を確保するってのは筋が悪いです
やるなら、呼び出し元で確保し、あとの処理もするようにしたほうがいいです

確保した領域のアドレスと、確保したサイズを関数に渡して処理するようにしましょう

投稿2020/06/03 03:58

y_waiwai

総合スコア88024

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

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

Ykkykk

2020/06/03 04:00

ご確認いただきありがとうございます。 呼び出し元で領域を確保した方が良いのですね。。。 基本的なことをお教えいただきありがとうございます!勉強になりました!
ponpoko1968

2020/06/03 04:03

まずは直近でわからないことに答えてあげる方が良いのかと思いました。y_waiwaiさんがおっしゃることは全くもって正しいのですが、とりあえず現状で意図したものが少なくとも意図したようにうごくようにならないと、なぜこの作りだと一般的に使える関数にならないかという課題に行き着くという、次のステップには進めないと思うんですよ。
guest

0

#Include <stdio.h> #include <stdlib.h> #include <string.h> int copy(char **buf) { char *src = "TEST\n"; size_t len = strlen(src); *buf = (char *)malloc(len); memset(*buf, 0, len); sprintf(*buf, "%s", src); return 0; } int main(void) { char *dst; int ret; ret = copy(&dst); printf("%s", dst); free(dst); return 0; }

投稿2020/06/03 03:55

編集2020/06/03 04:14
ponpoko1968

総合スコア84

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

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

Ykkykk

2020/06/03 03:59

ご回答ありがとうございます。ポインタのポインタにするのですね。。 理解できました。ありがとうございます。
episteme

2020/06/03 04:06

> *buf = (char *)malloc(strlen(src)); 1byte足りない > memset(*buf, 0, 20); オーバーランしてる
ponpoko1968

2020/06/03 04:10

超有名人に指摘されて恐縮です。。
episteme

2020/06/03 04:16

直後にsprintfしてんだからmemset要らなくね?
ponpoko1968

2020/06/03 04:21

見落としてました。要らないですね。もうちょっとちゃんと見落として添削すべきでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問