2016-11-03 6 views
-1

私はそれはそれがないように動作する理由を理解するのは難しい見つける次のコードウィッヒをしました:なぜscanfはchar *の動作を変えるように見えるのですか?

char* str = "HELLO"; 
printf("%s",&str[0]); //Returns Hello as expected 
printf("%c",str[2]); //Returns L as aspected 
scanf("%s",&str); //I enter aaaa 
printf("%s\n",&str); /* If I want to access the word I have to do this way 
&str[0] now gives a segmentation fault.*/ 
printf("%c\n",&str[1]); /*This gives a b???!!!. I haven't found any way to 
access individual character with *str.*/ 

であるが、私は、個々の文字にアクセスする方法はないように見える理由で特別に興味何らかの意味がありますが、charへのポインタを宣言しているはずですが、何らかの方法で文字列としてどのように動作するのでしょうか。しかし、私は最初のものが期待どおりの文字の配列として動作し、2番目のものではない理由を知りたいと思います。

ありがとうございました。

+1

a)コンパイラの警告、b)良いマニュアルが必要です。 –

+1

コンパイラで警告を有効にし、エラーとして扱います。 –

+0

@ user2638180:スコアの下にあるグレーのチェックマークをクリックすると回答を受け入れることができます。 – chqrlie

答えて

2

scanf("%s",&str);は未定義の動作を呼び出します:あなたは、文字列を読み、どちらかに変更すべきではない文字列リテラルであるstrポインタ自体の場所ではなく、それが指す場所、にそれを保存するためにscanfをお願いします。

関連する問題