質問:
/* string001.c */
#include <stdio.h>
void strcpy01(char *, char *);
int main()
{
char *str;
char *str01;
str = "ABC";
strcpy01(str01, str);//
printf("str01[0] = '%c',"
"str01[1] = '%c',"
"str01[2] = '%c',"
"str01[3] = '%c',",
str01[0], str01[1], str01[2],str01[3]);
return 0;
}
void strcpy01(char *s, char *t)//*t から *sに文字列をコピー
{
int i;

i = 0;
while(t[i] != '\0')
{
s[i] = t[i];
i++;
}
}

ボーランドCで、コンパイルしていますが、
コンパイルはできますが、実行させると動きません。
どこが悪いのでしょう。
教えてください。
答え:
str01と言うポインタ領域を確保するメモリアドレスが取得出来て居ない事が最大の原因である事は確かな事でしょう。
実際に、貴方のように記述したとしても、コンパイラはエラーを出しません。
従って、ポインタを使用する場合には、配列でメモリ領域を確保して使うのが無難です。
それと、まだ気付かれては居無い様ですが、

int i;

i = 0;

while(t[i] != '\0')
{

s[i] = t[i];

i++;

}

の後に、

s[i] = '\0';

が必要に成ります。
この '\0' が代入された s[i] は、貴方のプログラムでは、str01[3] に入って表示される事に成る文字型の配列 str01 の4番目の要素の中身(文字)と言う事に成ります。
この '\0' 文字が入らなければ、文字列の終わりが認識されない事は、既にご存知の事で有ると思います。
ですから、 strcpy01 関数に依って文字列をコピーするプログラムにする場合には、その文字列の終わりを表わす'\0' 文字をもコピーしなければ成らないと言う訳なのです。
上記のプログラムの終わりは、strcpy01 関数の終わりを示す { で終えて正解です。
尚、s[i] ='\0'; の箇所の i は i++; に依って既にインクリメントされて居る為に、単に i と記述するだけで結構なのです。
他は答える:
この質問・回答は役に立ちましたか?
答え:
答えは、str01にメモリが確保されてない為です。
ポインタ変数は、あくまでもメモリアドレスを記録する領域を確保するだけなので、文字列を記録するには、その前に文字列を確保する領域をプログラム中で確保する必要があります。
strは、"ABC"のアドレスが代入になるので、アドレスが記録され実行してもエラーにはなりません。
str01は、strの文字列がコピーされようとしますが、str01はこの時点では、メモリが確保されてるわけでも無く、示してるアドレスは変数を確保した時点の値のため不特定の位置を示してます。

ちなみに、コンパイラでは、記述的には間違ってないのでエラーが発生しないようになってしまってます。
それとこのプログラムですが、運が良いと動いてしまう事もありますが、実際には、不特定な位置に文字列をコピーしてるので問題を起こしてるプログラムになってます。


malloc関数などを利用して、メモリを確保してみてください。

ウェブサイトのユーザーによる情報ポスト、JPQA.comのない保証の正しさ.

  • CDのオーディオ音楽データをMP3変換できる簡単な...
  • avi形式の映画がHDに入ってます。友人からコピーし...
  • DVD Shrink Ver3.2のダウンロード方法を教えて下さい...
  • Yahoo!のジオクリエーターでホームページを作成してい...
  • セキュリティソフトで、日本国内におけるシェアがもっ...
  • 画像ファイルに文字、文章が書いてあり、それをテキ...