为什么scanf在字符输入中表现得很奇怪?
这是因为%d跳过了空白,但%c没有,换句话说 %d将跳过输入流中任何正在进行的空白,然后输入指针将紧跟在最后一个数字之后——最有可能是换行符。因此,当您来请求%c时,实际上您已经有了输入数据——这是您的换行符——这就是您将要阅读的内容 通过在%c之前插入一个空格,将您的扫描更改为要求它跳过空白,以便为什么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
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。我还没试过,但如果效果好的话,看起来会更好。