人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C言語初心者です。次の二つのコードについて質問があります。
strinput02.cでは、文字列の入力が出来ず、上手く動作しません。
ところが、01の用に書くと上手くいきます。
01も02もポインタを引数としてscanfに渡していると思うのですが、
なぜ02では上手くいかないのでしょうか?
文字のポインタ宣言した後に、文字列のアドレスを代入しないといけないということなのでしょうか?


//strinput01.c

#include <stdio.h>

int main()
{
char szStr[32];
char *str;

str = szStr;

printf("文字列を入力してください----");
scanf("%s", str);
printf("%s?n", str);

return 0;

}



//strinput01x.c

#include <stdio.h>

int main()
{
char *str;

printf("文字列を入力してください----");
scanf("%s", str);
printf("%s?n", str);

return 0;

}


●質問者: gbs01
●カテゴリ:コンピュータ 学習・教育
✍キーワード:Char C言語 STR アドレス コード
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● hyo-suke
●30ポイント ベストアンサー

01も02もポインタを引数としてscanfに渡していると思うのですが、

なぜ02では上手くいかないのでしょうか?

文字のポインタ宣言した後に、文字列のアドレスを代入しないといけないということなのでしょうか?

ポインタ(例で言う char *str;)は、単に str という矢印を作っただけです。

その先には文字列を入れるための領域を確保してあげる必要があります。

例01では char szStr[32]; という宣言がその領域になっており、

str = szStr;

でその領域を指し示しているため、scanf()が成功しています(szStr[32]に書き込めます)。

しかし例02では矢印(ポインタ)を宣言しただけで、その先には何もありません(見ず知らずの他人の領域を指しています)。

そのため怒られている(エラーとなる)のです。

ちなみに例01の char szStr[32]; の szStr というのも矢印に相当するので、次のようにも書けます。

//strinput01-2.c

#include <stdio.h>

int main()
{
char szStr[32];

printf("文字列を入力してください----");
scanf("%s", szStr);
printf("%s?n", szStr);

return 0;

}
<||

#どのみち、31文字以上の文字列を入力するとまずいですが。
◎質問者からの返答

回答ありございます。


2 ● Kuropen
●25ポイント

ポインタ変数というのはメモリ上で,ある変数のある位置 (アドレス) を記録しているだけであって実体がありません。

ポインタ変数を宣言しただけで初期化していないと,引数として渡された scanf は,どこを指し示しているのかがわからないから読み書きできないわけです。

一方,

char szStr[32];;
char *str;

str = szStr;

とすると,変数 str には szStr[0] のアドレスが代入されていて,scanfの引数として,strの値,すなわち szStr のアドレスが渡されて

szStr を読み書きできるということになります。

◎質問者からの返答

回答ありがとうございます。


3 ● GoldenDawn
●25ポイント

scanf で返される値を受け取るメモリ領域はあらかじめ自分で確保しておく必要があります。

ポインタだけ用意しても scanf が適当な場所に結果を格納して返してくれたりはしません。

char szStr[32];

char *str;

str = szStr;

これでも良いですが、

char str[32] ;

のほうが簡単です。

◎質問者からの返答

回答ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ