为什么scanf在字符输入中表现得很奇怪?

为什么scanf在字符输入中表现得很奇怪?,c,linux,C,Linux,这是因为%d跳过了空白,但%c没有,换句话说 %d将跳过输入流中任何正在进行的空白,然后输入指针将紧跟在最后一个数字之后——最有可能是换行符。因此,当您来请求%c时,实际上您已经有了输入数据——这是您的换行符——这就是您将要阅读的内容 通过在%c之前插入一个空格,将您的扫描更改为要求它跳过空白,以便 Enter two numbers:4 5 The arithmetic mean of two numbers is 4.000000 Enter the number:-7

这是因为%d跳过了空白,但%c没有,换句话说

%d将跳过输入流中任何正在进行的空白,然后输入指针将紧跟在最后一个数字之后——最有可能是换行符。因此,当您来请求%c时,实际上您已经有了输入数据——这是您的换行符——这就是您将要阅读的内容

通过在%c之前插入一个空格,将您的扫描更改为要求它跳过空白,以便

  Enter two numbers:4
  5
  The arithmetic mean of two numbers is 4.000000

  Enter the number:-7   **/*After hitting enter here it reaches line no. 7 */** 
  The absolute value of the number is 7

  Enter the character:                                          
  The letter in lower case  is  

  Enter two numbers:4   **/*line no. 7*/**
  6

  The bigger of two numbers is 6

这是因为%d跳过了空白,但%c没有,换句话说

%d将跳过输入流中任何正在进行的空白,然后输入指针将紧跟在最后一个数字之后——最有可能是换行符。因此,当您来请求%c时,实际上您已经有了输入数据——这是您的换行符——这就是您将要阅读的内容

通过在%c之前插入一个空格,将您的扫描更改为要求它跳过空白,以便

  Enter two numbers:4
  5
  The arithmetic mean of two numbers is 4.000000

  Enter the number:-7   **/*After hitting enter here it reaches line no. 7 */** 
  The absolute value of the number is 7

  Enter the character:                                          
  The letter in lower case  is  

  Enter two numbers:4   **/*line no. 7*/**
  6

  The bigger of two numbers is 6

%c读取任何字符,包括whitescape,因此它将“吃掉”换行符


使用:
scanf(“%c”和&c)

%c读取任何字符,包括白色,因此它将“吃掉”换行符


使用:
scanf(“%c”和&c)

这是因为在第一次
scanf
之后,回车键仍在输入缓冲区中,下一次
scanf
将把回车值存储在
x
中。然后,您的下一个
printf
将打印它-有效地移动到新行


要解决此问题,您只需在每次
scanf
之后添加一个
getchar()
调用,这是因为在第一次
scanf
之后,回车键仍在输入缓冲区中,下一次
scanf
将输入值存储在
x
中。然后,您的下一个
printf
将打印它-有效地移动到新行


要解决这个问题,您只需在每次
scanf

之后添加一个
getchar()
调用,我相信这里的问题是,您的scanf(“%c”,&c)在按enter键输入-7时正在获取输入的回车符


将一个getchar(或另一个scanf(“%c”,&c))放在scanf之前,您不应该有这个问题。

我认为这里的问题是,当您按enter键输入-7时,您的scanf(“%c”,&c)正在获取输入的回车符


将一个getchar(或另一个scanf(“%c”,&c))放在scanf之前,您不应该有这个问题。

scanf的一个常见问题是,它不使用按enter键所导致的换行符。我通常在调用
scanf

   scanf(" %c",&c);

当然,这并不总是您想要的,但在大多数情况下,它会起到作用。

scanf的一个常见问题是,它不会使用由按enter键引起的换行符。我通常在调用
scanf

   scanf(" %c",&c);

当然,这并不总是你想要的,但在大多数情况下,它会起到作用。

这是家庭作业,对吗?请标记它。(不相关)
#定义am(a,b)((a+b)/2)
应该是
#定义am(a,b)((a+b)/2.0)
才能按预期工作。@Joe:它实际上应该是
#定义am(a,b)((a)+(b))/2.0
,其他宏的参数也应该用括号括起来。通常最好完全避免
f
。这是家庭作业,对吗?请标记它。(不相关)
#定义am(a,b)((a+b)/2)
应该是
#定义am(a,b)((a+b)/2.0)
才能按预期工作。@Joe:它实际上应该是
#定义am(a,b)((a)+(b))/2.0
,其他宏的参数也应该用括号括起来。通常最好完全避免
f
。但是什么样的解决方案我必须按enter键才能到达新线但是什么样的解决方案我必须按enter键才能到达新线谢谢。。。。。。但这意味着,每当我尝试将一个字符作为输入时,我都需要在输入之前放置一个getchar()。不幸的是,是的,如果之前有另一个scanf导致用户按enter键,那么我们可以说这是c语言的一个缺点,或者是否有任何其他建议方法????哦,根据您可以使用scanf(“\n%c”,&x);%c之前的\n会导致scanf忽略第一个\n。我还没试过,但如果效果好的话会更好。谢谢。。。。。。但这意味着,每当我尝试将一个字符作为输入时,我都需要在输入之前放置一个getchar()。不幸的是,是的,如果之前有另一个scanf导致用户按enter键,那么我们可以说这是c语言的一个缺点,或者是否有任何其他建议方法????哦,根据您可以使用scanf(“\n%c”,&x);%c之前的\n会导致scanf忽略第一个\n。我还没试过,但如果效果好的话,看起来会更好。