C言語関係掲示板

過去ログ

No.158.printf("%p %p",p,str);


No.1016

すいませんけど、教えてください(~_~;)
投稿者---めい助(2002/02/04 22:30:31)


kikk さんには、”C言語の基本を押さえてからもう一度宜しくお願いします”
なんて言ったものの、こまかい障害が取り除けないと、最後までたどり着け
そうもないので、ご迷惑でしょうけどお付き合い下さいませ....

例によって、基本書についているコードからの質問です。

#include<stdio.h>

int main(void)
{
char *p,str[80];

printf("文字列を入力して下さい:");
p = gets (str);

if (p) /* ヌルでない場合 */
printf ("%s %s",p,str);

rerutn 0;
}

これは、gets() 関数の戻り値をどのように使うべきか? というプログラム
らしいのですが、私が今わからなくて悩んでいるのは

printf("%s %s", p, str) の、p という表記の仕方なんですけど、
ここで、ポインタ変数 p には、str の先頭を示すアドレスが格納されている
と思うのですが、何故 %s で文字列を取り出す事が出来るのでしょうか?
p に格納された先頭アドレスをたぐって、元の文字列のありかにアクセスして
文字列を表示させている? のでしょうか....
宜しくお願いします。


No.1018

Re:すいませんけど、教えてください(~_~;)
投稿者---ともじ(2002/02/04 23:01:07)


こんばんは。

>printf("%s %s", p, str) の、p という表記の仕方なんですけど、
>ここで、ポインタ変数 p には、str の先頭を示すアドレスが格納されている
>と思うのですが、何故 %s で文字列を取り出す事が出来るのでしょうか?

gets関数は文字列の入力に成功した場合、strと同じ値を返却します。
試しにここで、printf("%p %p",p,str); を実行すると、
pもstrも同じ値が出力されるはずです。(%pはポインタに対する書式指定)
printf関数で%sを書式指定した場合、与えられた文字列のアドレスから
'\0'までを文字列として出力します。つまり、pもstrも同じアドレスを
示すのならば、どちらを指定しても、同じ文字列を出力するわけです。


No.1029

Re:すいませんけど、教えてください(~_~;)
投稿者---めい助(2002/02/06 21:49:24)


ありがとうございました! 
納得できました。 
printf関数の、%s指定子にそんな働きがあったなんて
驚きです! どの本にもそんな事書いてなかったので...(~_~;)

また何かありましたら、宜しくお願いします!


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.03.16
Copyright(c) 2000-2002 TOMOJI All Rights Reserved