電子書籍の厳選無料作品が豊富!

#include <iostream.h>

void f(char* str);

main(){
char s[8] = "\0";
cout << "文字を入力" << '\n';
fgets(s, 8, stdin);
f(s);
}

void f(char* str){
char* c;
c = (char*)malloc(sizeof(char) * strlen(str)+1);
cout << strlen(str) << '\n';
cout << sizeof(c);
free(c);
}

- 結果 -
文字を入力 ( a、Ctrl+Z )
a
1
4

でした。

cout << sizeof(c);

の結果は4でした。1バイトの入力だから\0を含めて
2バイトを確保したかった。
そのためにはどうしたらいいんですか?
どうして4だったんですか?

文字を入力するとこで、Ctrl+Z の代わりに Enter を押すと
Enter まで s に格納されてしまう。
cin を使うと8バイト以上の入力でも s に格納されてしまう。
そうならないためのよい方法があったら教えてください。

A 回答 (2件)

>1バイトの入力だから\0を含めて2バイトを確保したかった。


>そのためにはどうしたらいいんですか?
安心してください。この方法で2バイト分のメモリ領域が確保できています。

>どうして4だったんですか?
cはcharポインタ型変数だからです。
ポインタ型のサイズは元の変数の型によらず一定値となります。

半分しか答えていないので自信は「なし」とさせていただきます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
4はポインタのサイズだったんですね。
cout << sizeof(*c);
で分かりました。

お礼日時:2002/02/24 18:31

>1バイトの入力だから\0を含めて 2バイトを確保したかった。


>そのためにはどうしたらいいんですか?
>どうして4だったんですか?

2バイト確保されているはずですよ。
実際に、sizeof(char) * strlen(str)+1 の値を出力されると、
2バイトになっていませんか?
ポインタcには、確保したメモリ領域の先頭アドレス番地が格納されているので
sizeof(c)では、確保したメモリの大きさではなく、
ポインタc自体のバイト数が表示されているのです。
実際にcの値を表示してみると分かると思います。



>文字を入力するとこで、Ctrl+Z の代わりに Enter を押すと
>Enter まで s に格納されてしまう。
>そうならないためのよい方法があったら教えてください。

fgetsを使うと、復改文字が残るのは当然です。
gets(s)等を使うと手軽だと思います。
ただ、s[8]を超えない処理が必要です。
    • good
    • 0
この回答へのお礼

sizeof(char) * strlen(str)+1
の値を出力されると2バイトになりました。

入力決定時の Enter については未解決だけど
1番知りたかった4の疑問が解決してよかったです。
ありがとうございました。

お礼日時:2002/02/24 18:31

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