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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Backbone.js

Backbone.jsはRESTfulなウェブアプリケーションを構築するJavaScriptフレームワークです。

Q&A

解決済

1回答

334閲覧

strcpyを使わずに文字をコピーする関数を作りたい。

adsdad

総合スコア1

Backbone.js

Backbone.jsはRESTfulなウェブアプリケーションを構築するJavaScriptフレームワークです。

0グッド

0クリップ

投稿2023/01/31 20:56

下のようなプログラムを作ったのですが、実行してみたら処理後の部分の実行結果が出ませんでした。これはどこが間違っているのでしょうか。
#include <stdio.h>
int strcpy1(char b[]);
int main(void){
char a[]="KONITIHA";

printf("処理前:%s\n",a); printf("処理後:%s\n",strcpy1(a)); return 0;

}
int strcpy1(char b[]){
int i;
char c[]="";

for(i=0;b[i]!=0;++i){ c[i]=b[i]; } return c[i];

}

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

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

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

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

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

Zuishin

2023/02/01 01:01

質問タグの使い方から何も考えてないことが伝わります。
guest

回答1

0

ベストアンサー

いくつかまずい点が見受けられます。
char c[] は オート変数なので、strcpy1() が return した時点でメモリが開放され、変数の値はなくなります。

char c[] = ""; は 空白文字列で配列を初期化してますので、配列の長さは1個しかありません。
1個しかないということは、c[0] は有効ですが、c[1] 以降は無効です。
for ループの中で c[i] = b[i] で値を代入していますが、c[1] ~ c[8] は無効な範囲ですので、これはメモリ上のデータを破壊している事になります。

C言語の文字列は文字列の終端に \0 が必要です。for ループでコピーした結果、最後の \0 が代入されてませんので、c[] に格納された文字列には \0 がない状態になってます。

strcpy1() の戻り値は char 型の c[i] 値が返されます。
「KONITIWA」の「K」だけが返されています。
そのため、printf() で表示しようとしても上手くいきません。

修正するには、まず、関数の引数や戻り値の型を見直してください。
また、コピー先の配列は、必要な数の要素を、確保してください。
コピーする際は、終端の \0 をコピー先の配列の最後に代入してください。

関数内の変数はオート変数といって、return すると開放されます。
開放されないように static 変数にするか、コピー元の配列を、引数で受け取るようにしてください。

ご不明点があれば、コメントで教えてください。

投稿2023/01/31 21:56

take88

総合スコア1359

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問