掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28510

scanfの挙動について
投稿者---みきもと(2006/10/18 19:34:07)


FreeBSDで、gcc version 2.95.4 20020320を使用しています。

#include<stdio.h>
int main(){
  int n;
  scanf("%d ",&n);
  printf("%d",n);
  return 0;
}


以上のようなプログラムを実行すると、2度値の入力を要求されるのですが、このような仕様があるのでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:scanfの挙動について 28511 たかぎ 2006/10/18 20:15:31


No.28511

Re:scanfの挙動について
投稿者---たかぎ(2006/10/18 20:15:31)
http://takagi.in/


結論からいうと、
>  scanf("%d ",&n);

の書式文字列の末尾に空白類文字(空白や改行等)が含まれているからです。
空白類文字は、次のような意味があります。(JIS X3010:2003 7.19.6.2 fscanf関数より引用)
空白類文字で構成される指令は, 最初の非空白類文字の直前まで(この文字は読み取らずに残す。), 又はそれ以上読み取ることができなくなるまで, 入力読取りを繰り返し実行する。




この投稿にコメントする

削除パスワード

No.28512

Re:scanfの挙動について
投稿者---みきもと(2006/10/19 01:52:36)


たかぎさん、ありがとうございます。

上のコードの実行に対し、例えば、
まず「4<改行>」つぎに「5<改行>」と入力する場合を考えると、

最初の<改行>をよんだあと、入力読取りを繰り返し実行しつづけるため
5が入ってくるまで待機状態におちいっている・・・

という解釈でよろしいでしょうか?

> 最初の非空白類文字の直前まで(この文字は読み取らずに残す。), 又はそれ以上読み取ることができなくなるまで


とありますが、最初の入力が「4<改行>」しかないので<改行>をよんだ時点でそれ以上読み取ることができなくなると、見なさないのでしょうか?


この投稿にコメントする

削除パスワード

No.28513

Re:scanfの挙動について
投稿者---たかぎ(2006/10/19 09:50:31)
http://takagi.in/


>最初の<改行>をよんだあと、入力読取りを繰り返し実行しつづけるため
>5が入ってくるまで待機状態におちいっている・・・
>
>という解釈でよろしいでしょうか?

5が入力された時点で、非空白類文字が現れたという解釈になります。

> 最初の非空白類文字の直前まで(この文字は読み取らずに残す。), 又はそれ以上読み取ることができなくなるまで
>とありますが、最初の入力が「4<改行>」しかないので<改行>をよんだ時点でそれ以上読み取ることができなくなると、見なさないのでしょうか?

改行というのは空白類文字の一種です。今回の場合、5という非空白類文字が現れるか、EOFに到達するまで、入力読取りが繰り返されます。



この投稿にコメントする

削除パスワード

No.28524

Re:scanfの挙動について
投稿者---みきもと(2006/10/19 19:25:21)


たかぎさん、返信ありがとうございます。

なんとか理解できました。ありがとうございました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧