トップページ⇒tech
41コメント11KB

scanfについて(c言語)

■ このスレッドは過去ログ倉庫に格納されています
0001ななさん NGNG
scanfの引数に文字列変数を指定するとき、
なぜ&(ポインタ?)をつけるのですか?
それと、scanfは使わない方がいいと言われたのですが、
なぜですか?
教えてください。
0002名無しさん@お腹いっぱい。 NGNG
Cの入門書でも買って読んでね>1
0003ななさん NGNG
>2さん
レスありがとうごさいます。
入門書は持っているのですが、詳しく載ってませんでした。
自分で調べたのですが、よく分からなかったです。
よろしくお願いします。
0004やさしい人。 NGNG
>なぜ&(ポインタ?)をつけるのですか?
scanfという関数に引数を与え、その引数に値を返す場合は
アドレスを渡してやらないとだめなんです。

void func(int *a)
{
 *a = 5;
}
を考えてみてね。
0005ななさん NGNG
>4さん
説明ありがとうございます
関数のアドレス渡しと同じなんですね。
でも、なぜアドレスを渡さないといけないのでしょうか?
「call by reference」「call by value」の違いは
教えてもらったのですが、いまいち分かりませんでした。

それと、なぜscanfは使わない方がいいのですか?
よろしくお願いします。
0006名無しさん@お腹いっぱい。 NGNG
>scanfは使わない方がいいと言われたのですが
ワームが怖いからです。
0007ななさん NGNG
>6さん
レスありがとうございます。
ワームとは何なのでしょうか?
初めて聞きました。

0008名無しさん@お腹いっぱい。 NGNG
>ワームとは何なのでしょうか?
アンチウィルスソフトのHELP見たらわかるよ
00096 NGNG
ごめんなさい、煽りでした。ワームがscanfの穴を利用したって聞いただけです。
ttp://www.netlaputa.ne.jp/~tackey/sotu/jirei.html
0010ななさん NGNG
>8さん
アンチウィルスソフトは持ってないのですが、
ネットなどで調べてみます。
ありがとうございました。
0011名無しさん@お腹いっぱい。 NGNG
人に訊く前に、いろいろ実験してみましょうね。

>なぜ&(ポインタ?)をつけるのですか?
付けないで試してみましょう。
多分、例外吐いて落ちます。

>それと、scanfは使わない方がいいと言われたのですが、
>なぜですか?
scanf("%d"@` &a);
とでも書いて、"1.1"とか"abc"とか入力してみましょう。
暴走したり、例外吐いたりすると思います。
0012ななさん NGNG
>6さん
「コンピュータウイルスの被害について」を見ました。
ワーム=ウィルスの一種ということなのでしょうか?
001311 NGNG
あとは、少し自分で考えてみましょう。
論理的思考力があれば、なんでポインタを渡す必要があるのか位はすぐ
わかると思いますけど。
0014きびしい人。 NGNG
>でも、なぜアドレスを渡さないといけないのでしょうか?
>「call by reference」「call by value」の違いは
>教えてもらったのですが、いまいち分かりませんでした。
氏ね。
0015ななさん NGNG
>11さん
はい。。
0016やさしい人。 NGNG
>でも、なぜアドレスを渡さないといけないのでしょうか?
>「call by reference」「call by value」の違いは
>教えてもらったのですが、いまいち分かりませんでした。

これをコンパイルして悩んで下さい。
ってか、悩む前に入門書に書いてあるので読んでみてね。

void func1(int a){a = 5;}
void func2(int *a){*a = 10;}

int main(void)
{
 int a = 0;
 printf("a=%d\n"@` a);
 func1(a); /* call by value */
 printf("a=%d\n"@` a);
 func2(&a); /* call by reference */
 printf("a=%d\n"@` a);
 return 0;
}
0017名無しさん@お腹いっぱい。 NGNG
なんで「入門書読め」で終わってるスレにこんなにレスがつくんだ・・・
0018やさしい人。 NGNG
これぐらいなら答えられるからなぁ。。>おれ
00196>17 NGNG
ななさん萌え〜ってことでしょ。
0020名無しさん@お腹いっぱい。 NGNG
7:3わけ?
0021名無しさん@お腹いっぱい。 NGNG
>でも、なぜアドレスを渡さないといけないのでしょうか?
そういう「仕様」だからです。

以上。
0022ななさん NGNG
でも、アドレスを教えたりしたらストーカーされないか心配です。
プライバシーの侵害です。
0023名無しさん@お腹いっぱい。 NGNG
>22
偽ななさん
ちょっとおもしろかったぞ
0024名無しさん@お腹いっぱい。 NGNG
なるほど。。確かに住所(アドレス)を教えなければ家の中(変数の中身)を荒らせないなぁ。
値渡しはアドレスを教えないから変数の中身を変更できないわけかぁ。
初心者にはわかりやすい例えになるかな?
0025しやあせ NGNG
scanfを使うのはやめて、getsかfgetsを使って、文字列を
取得した後、strtokで文字列の切り出しをしたほうがいいと思うよ。

strtokは、かなりクセの強い関数だけど、知れば目からウロコだよ。
(すでに知ってるなら、失礼しました)
0026>25 NGNG
strtokは、構造体を使うような形式なの自分で作っておくといいよ
0027名無しさん@お腹いっぱい。 NGNG
>>25
strtok()は入れ子にできない(内側実行した時点で外側が壊れる)
からなぁ。
0028名無しさん@お腹いっぱい。 NGNG
>>27
strtok()を入れ子で使いたい場合 strtok_r() という手がある。
でもソース文字列中のキー文字に'\0'を上書きしていくという
動作はstrtok()と何ら変わりはないので、親トークンの内容は
やはり切り刻まれます(w
0029名無しさん@お腹いっぱい。 NGNG
>11
なぜ"1.1"とか"abc"で落ちるの?
自分は実験してみた?
0030名無しさん@お腹いっぱい。 NGNG
>>29
やってないんでしょう。
「…と思います。」って書いてあるし。
0031名無しさん@お腹いっぱい。 NGNG
>>11
人に教える前に、ちゃんと勉強しましょうね。

http://ftp.linux.or.jp/JM/html/LDP_man-pages/man3/vsscanf.3.html
0032名無しさん@お腹いっぱい。 NGNG
>>29-31
>暴走したり、
まあ、ループ内で、戻り値をチェックしない場合を想定しているのでしょう
0033名無しさん@お腹いっぱい。 NGNG
scanf使うくらいなら、
単純な字句解析器を作っておいて、使いまわせばいいと思うけど。
0034名無しさん@お腹いっぱい。 NGNG
>>32

> scanf("%d"@` &a);
> とでも書いて、"1.1"とか"abc"とか入力してみましょう。

これ見ただけじゃ、そんな想定してるようには思えんぞ。
0035maido NGNG
改行のことについて触れらていない。

fgets(str@`sizeof(str)@`stdin); を使おう。
003611 NGNG
ん?ちゃんと試したぞ。
昔、Cの勉強してたときにそう言うことをやってみたら派手に暴走してくれたん
だが‥‥‥環境の問題かな?
まあ、暴走しないんなら暴走しないでいいや。

>>34
>これ見ただけじゃ、そんな想定してるようには思えんぞ。
想定してない入力をユーザーがしないんだったら苦労はしません。
0037名無しさん@お腹いっぱい。 NGNG
このスレッド、タイトルみたらネタかと思ったよ。
マジなのね。
0038名無しさん@お腹いっぱい。 NGNG
>>36
入力した時点で暴走するの??
31 のリンク先見てみた感じではそんな事はなさそうだけど・・・
つーか、11 はネタ?
003911 NGNG
>>38
いや、ネタじゃないぞ。
なんか、出力しようとしたらおかしくなったような気がするんだが‥‥‥
昔のことなんでよく覚えてない。すまんね。
0040名無しさん@お腹いっぱい。 NGNG
使い捨てのプログラムなら多少複雑な入力も sscanf をパーサのように酷使するな。俺。
0041名無しさん@お腹いっぱい。 NGNG
>39
まあ、むかしのコンパイラはscanf@`printfがまともに動かないのが多かった。
doubleとかの場合、NaNとか入っているとprintfが死んでしまってデバッグ用の
printfのところで暴走するのは悲しかったな。
■ このスレッドは過去ログ倉庫に格納されています