アプリ版:「スタンプのみでお礼する」機能のリリースについて

char s[10];
strcpy(s,"ABCDE");
は、sにABCDEを代入でいいのでしょうか?
ちなみにs[10]だと文字数があうのはわかるのですが、
strcpy(s[10],"ABCDE");だとだめなのでしょうか?

A 回答 (2件)

こんにちは。



strcpy()関数は第1引数で与えられたメモリへ第2引数で与えられたメモリから、文字列の終わりを示す印'\0'(ヌル文字)を見つけるまでコピーする関数です。
"ABCDE"ではヌル文字'\0'を定義していませんが、文字列の最後には自動的にコンパイラがヌル文字'\0'を付加しています。

さて2つ目の質問ですが、残念ながら配列とポインタについて、理解が不足しているようです…。
まず、strcpy()の第1引数は、文字列を格納する配列変数の頭を指すポインタを渡さなければなりません。ですから、strcpy(s[10],"ABCDE");をコンパイルすると、エラーになると思います。s[10]はchar型として認識されるので、ポインタ(char*)ではないからです。
また、(char*)s[10]としてキャスト(型変換)すると、コンパイルは通りますがバッファオーバーフローします(実行時にエラーになるかは、環境しだいですが、正しく実行されないと思います)。これは、変数sの先頭から数えて10バイト目から文字列"ABCDE"のコピーが行われるためで、もともと10バイトしか確保していない変数へ15バイトのデータを書き込むのと同じです。なお、0~9バイト分には何もコピーされないので、おかしな値が入ると思います。

C言語においてポインタは避けては通れない部分になりますので、あせらず確実に理解できるよう、がんばってください。
    • good
    • 0
この回答へのお礼

ポインタ、基礎からじっくり勉強してみます。
ありがとうございました!!

お礼日時:2009/05/16 12:36

>char s[10];


>strcpy(s,"ABCDE");
>は、sにABCDEを代入でいいのでしょうか?
代入じゃないですね。コピーです。

>ちなみにs[10]だと文字数があうのはわかるのですが、
いえ合ってないですけど。
"ABCDE"は5文字+\0で6バイトです。
s[10]は10バイトですね。

>strcpy(s[10],"ABCDE");だとだめなのでしょうか?
だめですね。コンパイルエラーします。
strcpy(s[10]
はどういう意味になるか書いてみてください。
    • good
    • 0
この回答へのお礼

いや~勉強不足です。
strcpy(s[10]だとおかしな値が出てしまいますね。
もう一度文法の本でstrcpyのこと調べてみます。
ありがとうございました。

お礼日時:2009/05/16 12:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!