2011-07-05 16 views

答えて

9

入力にいずれ、含まない形式の文字列マッチに空白の任意の量(例えば、空白、タブ、改行など)を空白。

http://www.manpagez.com/man/3/scanf/

+0

'RETURN'キーと一致しますか? –

+1

@Je Rog:「キー」と一致しません。それは入力*文字*と一致します。改行文字は空白と見なされるので、改行文字はスキップされます。 – AnT

+0

はい、 "改行"にマッチするためにスペースを使用できます。注意してください.RETURNキーを押すとWindowsでは "\ r \ n"、Linuxでは "\ n"のみが送信されます。しかし、簡単な数値入力スキャンの場合は、通常、数字の変換はスキャンしている入力のタイプに応じて非数字( '.' ''と '' + ')が許されるとすぐに停止するので問題はありません) –

4

scanf形式の空間は、上の現在の位置から "すべての空白をスキップ" を意味します。ほとんどのscanfフォーマット指定子は、何かを読み込もうとする前にすべての空白をスキップしているので、スペースはほとんどの場合scanfフォーマットでは使用されません。ただし、空白を無視しない書式指定子を使用している場合は、必要に応じて書式内のスペースを含めて(スキップを強制する)意味があります。

空白を無視しない指定子は、c[およびnです。したがって、これらの指定子の1つの前にスペースを指定すると違いが生じます。それ以外の場合は、何の違いもありません。具体的な例では、scanf形式のスペースを使用したため(空白は%cを使用しているため)、空白は特に無視されます。スペースを取り除き、何が起こるかを見てください。

0

スペースとは、スペースが入力として受け入れられることを意味します。 fgetsではなくscanfを使うという危険性について、この関連スレッドを読んでみたいかもしれません。

How do you allow spaces to be entered using scanf?

2

フォーマットストリング内の空白文字は、最初の非空白文字まで、入力から0個以上の空白文字を無視します。

1

documentation for scanfは言う:これ以上の有効な入力は読まないことができるようになるまで、一つ以上の空白文字で構成ディレクティブは入力を読み込むことで実行されなければならない

、またはではありません最初のバイトまで空白文字は未読のままです。変換指定は、[C、C、またはN、変換指定子が含まれない限り

また

入力空白文字(isspaceで指定されるように)、スキップしなければなりません。

これは、フォーマット文字列内のスペースが必要であることを意味します。あなたが整数を読んでするつもりだった場合は、しかし、スペースが冗長されているでしょう:数値書式指定子がそうであるように

/* equivalent statements */ 
scanf(" %d %d %d", &v1, &v2, &v3); 
scanf("%d%d%d", &v1, &v2, &v3); 
0

% cが空白文字をスキップしません。 使用するので、場合:

#include<stdio.h> 
int main(int argc, char* argv[]){ 
    char c; 
    scanf("%c", &c); 
    printf("%c\n", c); 
    scanf("%c", &c); // Try running with and without space 
    printf("%c\n", c); 
    return 0; 
} 

これは、入力バッファ内の前の空白文字が第二のscanfに行われます、そして、あなたが入力するチャンスを得ることはありません可能性が非常に高いです。 %cより前のスペースは、入力バッファに空白文字があれば、それをスキップして入力を正しく入力できるようにします。 時には同じ効果の人々が書く得るために:

fflush(stdin); 
scanf("%c" &c); 

しかし、C標準にfflush(STDIN)の動作は未定義であることを指定して、これは非常に悪いプログラミングと考えられています。 whitespacesをよくキャプチャする特定の理由がない限り、常にフォーマット文字列内のスペースを使用してください。

関連する問題