你好!我想请教你关于利用scanf函数输入时,留在键盘缓冲区的\n(ASCII值为10)的问题。期待你的回答。至于分数,你想要多少,说就行。我昨晚写程序时对scanf在键盘缓冲区留下的字符有疑问,思考不果。看了百度百科上的scanf词条,说scanf输入遇到空格、跳格、回车才会从缓冲区往变量送字符。于是自己写了以下几个程序思考,还是不果。
程序1
#include "stdio.h"
void main()
{
char a;
char b;
scanf("%d",&a);
scanf("%d",&b);
printf("%d %d",a,b);
}
键盘输入
97<回车>96<回车>
输出
97 96
问题1:调用第一个scanf输入时,键盘缓冲区所有的字符为97\n,遇到回车,所以缓冲区把97赋值给a。调用第二个scanf输入时,键盘缓冲区所有的字符为96\n,遇到回车,所以缓冲区把96赋值给b。以上我的分析对吗?
程序2
#include "stdio.h"
void main()
{
char a;
char b;
scanf("%c",&a);
scanf("%c",&b);
printf("%d %d",a,b);
}
键盘输入
9<回车>
输出
57 10
问题2:调用第一个scanf输入时,键盘缓冲区所有的字符为9\n,遇到回车,所以缓冲区把9赋值给a。调用第二个scanf输入时,键盘缓冲区所有的字符为\n,遇到回车,所以缓冲区把\n赋值给b。以上我的分析对吗?如果对,那程序1中调用第一个scanf时,又为什么不是把97赋值给a后,将\n赋值给b呢?为什么调用第二个scanf时还需要继续输入96<回车>来对b赋值?调用第一个scanf输入时留在缓冲区的\n去哪里了?无端消失了?
程序3
#include "stdio.h"
void main()
{
char a[100];
char b[100];
scanf("%s",a);
scanf("%s",b);
printf("%s %s",a,b);
}
键盘输入
abc<回车>def<回车>
输出
abc def
问题3:从输出结果可以看出,字符数组a和字符数组b都在同一行输出。所以字符数组a的值为{‘a’,’b’,’c’},不是{‘a’,’b’,’c’,’\n’}。字符数组b的值为{‘d’,’e’,’f’},不是{‘\n’,‘d’,’e’,’f’},也不是{‘\n’,‘d’,’e’,’f’,’\n’}。以上的分析对吗?如果对,那调用第一个scanf输入时留在缓冲区的\n去哪里了?还有第二个scanf留下\n呢?
程序4
#include <stdio.h>
void main()
{
int i;
char j;
for(i=0;i<2;i++)
scanf("%c",&j);/*注意这里%前没有空格*/
printf("%d",j);
}
键盘输入
1<回车>
输出
10
程序5
#include <stdio.h>
void main()
{
int i;
char j;
for(i=0;i<2;i++)
scanf(" %c",&j);/*注意这里%前有一个空格*/
printf("%d",j);
}
问题4:程序4应该就像程序2那样,最后把\n(ASCII值为10)赋值给j了,所以输出10。但程序5 scanf里那个空格如何阻止\n给j赋值?想不通,恳请赐教!
程序6
#include "stdio.h"
void main()
{
int a;
int b;
scanf("%c",&a);
scanf("%c",&b);
printf("%d %d",a,b);
}
键盘输入
1<回车>
输出
-858993615 -858993654
问题5:这个问题和\n无关的,但写了程序1,却发现了这个问题。我用的是VC6,就算不是VC6,C的任何编译软件里int和char不都是通用的吗?为什么程序1用%d格式能正常获得char型变量,但程序6用%c格式却不能正常获得int型变量?
我知道我问得的确很多,但非常期待您的回答!想要多少分数,你开口就行,我有多少就给多少,反正能学到东西才是重要的!感谢!!!
C语言scanf函数输入时键盘缓冲区\\n的问题
scanf("%c",&j);\/*注意这里%前没有空格*\/ printf("%d",j);} 键盘输入 1<回车>,这里scanf执行了两次(i==0时,与i==1时),而且每次都是想对j赋值。第一次scanf,按%c的要求,只扫描buffer中的一个字节,但是buffer中并不数据,于是要求键盘输入数据到buffer,此时的1<回车>代表向buffer...
关于C语言scanf中\\n 的问题
scanf("%d\\n", &i);printf("%d\\n", i);你输入一个数后,它是不会立即显示的,要等再接收到一个非(空格、制表符、回车)的输入scanf语句才结束。但请注意的是,最后输入的那个非(空格、制表符、回车)的东西是不会被这个scanf读进来的,而是留在输入流里。所以3会被x读入,也就是说最后...
为什么scanf那一行语句加了\\n得输入两次字符才能输出,去掉\\n就正常了...
scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。其调用格式为: scanf("<格式化字符串>",<地址表>);解释原因:scanf在每次回车之后从缓冲区中读取用户输入的字符,且当缓冲区非空时,输入回车之后才会自动结束。当按照scanf("%c\\n", &m)这种形式书写时,相当于你输入结...
谁帮我看下 C语言问题?scanf中加\\n之后的作用
当你从键盘输入数据时,是先放在该缓冲中,然后scanf才从该缓冲中读数据,你不加\\n时,你输入i的值,然后回车想再输入m的值吧?这时送到缓冲中的就是i的值和一个回车符,所以scanf第一次读的是i,第二次读的就是一个回车符,所以printf(" %c\\n",m);输出的是回车,而不是你理想中的m值,...
c语言关于scanf的小问题
解决的办法就是在输入字符前,用一条语句把那个遗留在缓冲区中的‘\\n'给接收了或删除了就行,用getchar()是接收,用fflush(stdin)是删除,都是可以的。而在%c前加一个空格和getchar()作用一样,因为scanf()函数中的控制符中加入什么符号就要输入什么符号,这个空格就相当于要求输入一个空格,刚好把...
c语言新手scanf问题
是scanf("%f\\n",&fSalary)和scanf("%d\\n",&iNum)两条语句格式化输入中“\\n”造成的。预备知识:(1)scanf()函数接收输入数据时,遇回车键,开始从键盘缓冲区读输入字符(这个回车符不被读入,并留在缓冲区中),并按格式化输入指定条件,赋给相应变量;读入字符时,有非空字符(空字符如:空格...
Scanf函数有一个\\n,其作用是什么?
scanf("%s",str);\/*此处输入:I love you! *\/ printf("%s",str); Sleep(5000);\/*这里等待5秒,告诉你程序运行到什么地方*\/ \/*不是sleep(5) 1,函数名是Sleep不是sleep。2,C\/C++中,unsigned Sleep(unsigned)应该是毫秒ms. scanf("%s",str1);\/*这两句无需你再输入,是对键盘盘缓冲区再扫描 *\/ sca...
C语言的scanf("%d\\n",&r);只要加入\\n逻辑就错了,有大神能告诉我为什么...
\\n就结束输入了,scanf函数的第一个参数是都要输入的,你这个"%d\\n",就需要先输入一个整数,再输入一个"\\",再输入一个"n",再回车,所以一直阻塞在这,随便搜的一个博客,看看应该就理解了 网页链接
C语言中scanf("%d\\n")中的\\n存在与不存在对于编译结果不同的详细解释...
scanf("%d\\n",&i);printf("%d\\n",i);(1)如果 你 拍入 1 和 Enter 键,scanf("%d\\n",&i); 会等待,再拍 Enter 键 Enter 键 Enter 键 ... 它还在 等待。(2)如果 你 拍入 1 空白 2 和 Enter 键,2个句语句 便执行完毕,打印出 1 多余拍入 的 2 留在 输入缓冲...
为什么输入的时候scanf("%c",&st[i]); %c之前不加\\n就不好使
这可能是键盘缓冲区的问题。请在scanf前面加入 fflush(stdin);您再试试~~