ここで、私は受け入れられた答えでこの声明を見ました:
ほとんどの変換指定子は、改行を含む先頭の空白をスキップしますが、スキップ
%c
しません。
私にとって、この異なる振る舞いの下での論理的根拠は明確ではありません、私は均一なものを期待していました(例えば、常にスキップするか、決してしない)。
私は次のようなCコードでこの種の問題に遭遇しました:
#include "stdio.h"
int main(void){
char ch;
int actualNum;
printf("Insert a number: ");
scanf("%d", &actualNum);
// getchar();
printf("Insert a character: ");
scanf("%c", &ch);
return 0;
}
2つscanf
のsを交換すると、問題と(コメント付き)が解決されます。getchar
そうしないと、最初の挿入のが2番目の'\n'
挿入によって消費されます。LinuxとWindowsの両方でgccでテストしましたが、動作は同じです。scanf
%c
gcc(GCC)4.7.2 20120921(Red Hat 4.7.2-2)
Copyright(C)2012 Free Software Foundation、Inc.
これはフリーソフトウェアです。コピー条件については、ソースを参照してください。保証はありません。商品性や特定の目的への適合性についてもそうではありません。
だから私の質問は:なぜ%d
とは%c
異なる動作'\n'
をするのscanf
ですか?