Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scanf()将新行字符保留在缓冲区中_C_Scanf - Fatal编程技术网

scanf()将新行字符保留在缓冲区中

scanf()将新行字符保留在缓冲区中,c,scanf,C,Scanf,我有以下计划: int main(int argc, char *argv[]) { int a, b; char c1, c2; printf("Enter something: "); scanf("%d",&a); // line 1 printf("Enter other something: "); scanf("%d", &b); // line 2 printf("Enter a char: "); scanf("%c",&

我有以下计划:

int main(int argc, char *argv[])
{
  int a, b;
  char c1, c2;
  printf("Enter something: ");
  scanf("%d",&a); // line 1
  printf("Enter other something: ");
  scanf("%d", &b); // line 2

  printf("Enter a char: ");
  scanf("%c",&c1); // line 3
  printf("Enter another char: ");
  scanf("%c", &c2); // line 4

  printf("Done"); // line 5

  system("PAUSE");

  return 0;
}
正如我在C语言书中读到的,作者说,
scanf()
在缓冲区中留下了一个新行字符,因此,程序不会停在第4行让用户输入数据,而是将新行字符存储在c2中,并移到第5行

是这样吗

但是,这是否只发生在
char
数据类型中?因为我在第1、2、3行中没有看到
int
数据类型的问题。是否正确?

在尝试解析字符以外的转换之前,函数会自动跳过前导空格。字符格式(主要是
%c
;也包括扫描集
%[…]
-和
%n
)是例外;它们不会跳过空白

使用带前导空格的
“%c”
跳过可选空格。请勿在
scanf()
格式字符串中使用尾随空格

请注意,这仍然不会消耗输入流中留下的任何尾随空格,甚至不会消耗到行尾,因此如果同时使用或在同一输入流上使用,请注意这一点。我们只是让scanf在转换之前跳过空白,就像它在
%d
和其他非字符转换中一样


请注意,非空白的“指令”(要使用)不是转换,例如
scanf中的文本(“order=%d”,&order)也不会跳过空白。文本
顺序
必须与要读取的下一个字符匹配

因此,如果要跳过前一行的换行,但仍需要固定字符串上的文字匹配,则可能需要
“order=%d”

在尝试解析字符以外的转换之前,函数会自动跳过前导空格。字符格式(主要是
%c
;也包括扫描集
%[…]
-和
%n
)是例外;它们不会跳过空白

使用带前导空格的
“%c”
跳过可选空格。请勿在
scanf()
格式字符串中使用尾随空格

请注意,这仍然不会消耗输入流中留下的任何尾随空格,甚至不会消耗到行尾,因此如果同时使用或在同一输入流上使用,请注意这一点。我们只是让scanf在转换之前跳过空白,就像它在
%d
和其他非字符转换中一样


请注意,非空白的“指令”(要使用)不是转换,例如
scanf中的文本(“order=%d”,&order)也不会跳过空白。文本
顺序
必须与要读取的下一个字符匹配

因此,如果要跳过前一行的换行,但仍需要固定字符串上的文字匹配,则可能需要
“order=%d”

使用
scanf(“%c”和&c2)。这将解决您的问题。

使用
scanf(“%c”和&c2)。这将解决您的问题。

在调用第二个
scanf()之前使用
getchar()

scanf("%c", &c1);
getchar();  // <== remove newline
scanf("%c", &c2);
scanf(“%c”和&c1);
getchar();// 在调用第二个
scanf()
之前使用
getchar()

scanf("%c", &c1);
getchar();  // <== remove newline
scanf("%c", &c2);
scanf(“%c”和&c1);
getchar();// 另一个选项(我从中得到)是使用赋值抑制选项读取并丢弃换行符。为此,我们只需设置一种格式来读取一个星号介于
%
c
之间的字符:

scanf("%d%*c",&a); // line 1
scanf("%c%*c",&c1); // line 3
scanf
随后将读取下一个字符(即换行符),但不会将其分配给任何指针

然而,最后,我要说的是:

或者,根据您的需求,您也可以忘记scanf()/getchar(),使用fgets()从用户那里获取一行文本并自己解析

另一个选项(我从中得到)是使用赋值抑制选项读取并丢弃换行符。为此,我们只需设置一种格式来读取一个星号介于
%
c
之间的字符:

scanf("%d%*c",&a); // line 1
scanf("%c%*c",&c1); // line 3
scanf
随后将读取下一个字符(即换行符),但不会将其分配给任何指针

然而,最后,我要说的是:

或者,根据您的需求,您也可以忘记scanf()/getchar(),使用fgets()从用户那里获取一行文本并自己解析


为了回应我的帖子:我建议扔掉
scanf()
,不要使用它,而是使用
fgets()
sscanf()
(*)

原因是,至少在类似Unix的系统中,默认情况下,CLI程序运行的终端会在程序看到用户输入之前对其进行一些处理。它缓冲输入,直到输入换行符,并允许一些基本的行编辑,如使退格工作

所以,你不可能一次只得到一个字符,或者几个字符,只是一整行。但这不是例如scanf(“%d”)
所处理的,相反,它只处理数字,然后停在那里,剩下的缓冲在C库中,供将来的
stdio
函数使用。如果你的程序有,例如

printf("Enter a number: ");
scanf("%d", &a);

printf("Enter a word: ");
scanf("%s", word);
然后输入行
123 abcd
,它会同时完成两个
scanf()
s,但只有在给出换行符之后。第一个
scanf();第二个
scanf()
不会等待您输入另一行(因为输入缓冲区已经包含足够的内容来填充
%s
转换)

这不是用户通常期望的

相反,他们希望按enter键完成输入,如果按enter键,您会得到一个默认值或一个错误,可能会有一个建议,请您真正给出答案

使用
scanf(“%d”)