每次scanf不是要以回车结束的么?为何这么多scanf只用一次回车??
答案:5 悬赏:0 手机版
解决时间 2021-03-22 22:31
- 提问者网友:几叶到寒
- 2021-03-22 18:42
每次scanf不是要以回车结束的么?为何这么多scanf只用一次回车??
最佳答案
- 五星知识达人网友:渊鱼
- 2021-03-22 19:40
scanf 从输入流缓冲区里 读取数值,如果输入缓冲区内已有数值,它就可以取用,如果缓冲区里 没有数值,或数的个数不足,scanf 就要等待。 这是第一点。
第2点,那么 缓冲区里 的数 从何而来?答:是从键盘 缓冲区里来。
键盘 缓冲区 的数据 只有当 遇到 回车键 时 才 送到 输入流缓冲区,否则 留在 键盘 缓冲区里,没到 输入流缓冲区里去。
这就是清楚了,并非 scanf 一定要等 回车,scanf 只是等 输入流缓冲区 有数好取。键盘一次拍入很多数,回一次车,输入流缓冲区就有了很多数,scanf就不需等待回车不回车了。
scanf 读数 以空白为数的分隔符,空格,回车属 空白。 回车 对 scanf 来说,是 数的分隔符。追问scanf读取数据不用等,但是scanf结束一定要回车啊。当我们用一次scanf时候,不管按多少空格,最后都是要以回车来结束scanf 。这样程序才能往下执行。
而这个程序里,凭什么决定scanf运行结束,然后判断进入循环,然后再次调用scanf????没有啊,整个过程只有最后一个回车,这是怎么回事呢?追答scanf结束 本身,不需要回车。不管连续按多少空格,scanf 只当1个空格。
用户一次性输入若干数,回车,然后自动求和。
用 gets() 把整行数据存入 char str[2000];
用 sscanf(str,"....",..); 处理。
如果规定好,最后一个数结束时没有后续空格:例如,1 2 3 4 5 6回车:
int x,sum=0;
char c;
scanf("%d",&sum);
while(1){
c = getchar();
if (c=='\n') break;
if ( scanf("%d",&x) == 1 ) sum+=x; else break;
}
printf("%d",sum);
题目的意思是 输入前并不知道将输入多少数,输入时,只考虑1行,无论多少个数,遇到行结束符,输入就算结束,程序要能分辨出一个一个数,并计算出它们的和。
scanf 本身是不需要回车符作为结束符,并不要每个数结束都要带回车符。所以题目不矛盾。追问scanf结束 本身,不需要回车————但实际操作中,只运行一次scanf 不是要回车结束吗?这又怎么说不需要回车呢?追答scanf 从输入缓冲区取数,不需要回车。
键盘缓冲区的东西,发送到 输入缓冲区,需要回车符触发。
例如:c = getchar(); 时,拍入了 123 456 78回车,getchar(); 只取用了1,其余 23 456 78都留在输入缓冲区,scanf从 23 开始取数,剩余的 456 78 还留在输入缓冲区。
输入缓冲区 和 键盘缓冲区 是不同的区。你要 分清两个区,就明白 回车符的作用。追问原来如此,我有点明白了。就是说,scanf读取输入缓冲区的数据,如果没有数据可读,那么打开输入通道,制定好输入的一些要求,让用户输入,用户输入只是在键盘缓冲区输入,回车后才把数据弄到输入缓冲区。然后scanf读取
如果一开始输入缓冲区已经有数据了,那么scanf就不会打开通道让用户输入,它直接就读取数据,然运行,是这样吗追答对。你总算弄明白了。
第2点,那么 缓冲区里 的数 从何而来?答:是从键盘 缓冲区里来。
键盘 缓冲区 的数据 只有当 遇到 回车键 时 才 送到 输入流缓冲区,否则 留在 键盘 缓冲区里,没到 输入流缓冲区里去。
这就是清楚了,并非 scanf 一定要等 回车,scanf 只是等 输入流缓冲区 有数好取。键盘一次拍入很多数,回一次车,输入流缓冲区就有了很多数,scanf就不需等待回车不回车了。
scanf 读数 以空白为数的分隔符,空格,回车属 空白。 回车 对 scanf 来说,是 数的分隔符。追问scanf读取数据不用等,但是scanf结束一定要回车啊。当我们用一次scanf时候,不管按多少空格,最后都是要以回车来结束scanf 。这样程序才能往下执行。
而这个程序里,凭什么决定scanf运行结束,然后判断进入循环,然后再次调用scanf????没有啊,整个过程只有最后一个回车,这是怎么回事呢?追答scanf结束 本身,不需要回车。不管连续按多少空格,scanf 只当1个空格。
用户一次性输入若干数,回车,然后自动求和。
用 gets() 把整行数据存入 char str[2000];
用 sscanf(str,"....",..); 处理。
如果规定好,最后一个数结束时没有后续空格:例如,1 2 3 4 5 6回车:
int x,sum=0;
char c;
scanf("%d",&sum);
while(1){
c = getchar();
if (c=='\n') break;
if ( scanf("%d",&x) == 1 ) sum+=x; else break;
}
printf("%d",sum);
题目的意思是 输入前并不知道将输入多少数,输入时,只考虑1行,无论多少个数,遇到行结束符,输入就算结束,程序要能分辨出一个一个数,并计算出它们的和。
scanf 本身是不需要回车符作为结束符,并不要每个数结束都要带回车符。所以题目不矛盾。追问scanf结束 本身,不需要回车————但实际操作中,只运行一次scanf 不是要回车结束吗?这又怎么说不需要回车呢?追答scanf 从输入缓冲区取数,不需要回车。
键盘缓冲区的东西,发送到 输入缓冲区,需要回车符触发。
例如:c = getchar(); 时,拍入了 123 456 78回车,getchar(); 只取用了1,其余 23 456 78都留在输入缓冲区,scanf从 23 开始取数,剩余的 456 78 还留在输入缓冲区。
输入缓冲区 和 键盘缓冲区 是不同的区。你要 分清两个区,就明白 回车符的作用。追问原来如此,我有点明白了。就是说,scanf读取输入缓冲区的数据,如果没有数据可读,那么打开输入通道,制定好输入的一些要求,让用户输入,用户输入只是在键盘缓冲区输入,回车后才把数据弄到输入缓冲区。然后scanf读取
如果一开始输入缓冲区已经有数据了,那么scanf就不会打开通道让用户输入,它直接就读取数据,然运行,是这样吗追答对。你总算弄明白了。
全部回答
- 1楼网友:动情书生
- 2021-03-23 01:06
以输入 ”1 2 回车“ 为例:
1, 按下回车后 scanf 开始读值
2,scanf 每次读一个值 遇到下一个空格时停止,返回值是读取的数值,
此时是 1,2, 符合条件
scanf("%d",&i)== 1
但当读到回车时,返回值是 0 因为读取发生了错误
不符合 scanf("%d",&i)== 1 // 0 == 1 错误!
所以停止循环,即不在读取数字
1, 按下回车后 scanf 开始读值
2,scanf 每次读一个值 遇到下一个空格时停止,返回值是读取的数值,
此时是 1,2, 符合条件
scanf("%d",&i)== 1
但当读到回车时,返回值是 0 因为读取发生了错误
不符合 scanf("%d",&i)== 1 // 0 == 1 错误!
所以停止循环,即不在读取数字
- 2楼网友:你可爱的野爹
- 2021-03-22 23:31
scanf的返回值是输入值得个数追问我知道,又不是问这个
- 3楼网友:逐風
- 2021-03-22 21:57
scanf 空格也可以分割追问分割我知道,但结束不是一定要回车么?如果只执行一次scanf,难道不按回车它能结束?
- 4楼网友:慢性怪人
- 2021-03-22 21:06
scanf 语句支持一次输入多个变量,scanf一次最多读入一行的变量。
按回车键是告诉scanf输入结束了。如果你输入一个数后,按回车,那么根据输入的这个数
while循环的条件语句scanf(%d,&i) = =1,会进行判断,满足条件则继续执行循环体中的内容。
若你在一行内输入所有数据,则如果你用空格分开,程序就会等你按下回车告诉系统你输入完了,程序才会判断。追问scanf 语句支持一次输入多个变量?那是设定好了scanf接受多个变量吧,比如scanf(%d%d%d,&i,&j,&k)
这里设定好了,scanf运行一次只接受一个变量,我的意思是,scanf运行一次,必须要靠回车结束,但这里循环明显运行了多次,怎么只用一个回车呢追答在C语言中对数据的存储时一字节为单位的。输入输出的数据流的开始和结束仅受程序控制而不受物理符号(如 回车换行)控制。一批数据输入到内存缓冲区,然后再从缓冲区逐个的将数据送到程序数据区。追问如果这样的话,那么我取消循环,只用一个scanf,只需要输入一个元素,那肯定要回车scanf才结束,流程才会继续执行下去吧?
如果他不受回车控制,那么不输入回车,流程就会自动进行下去,那又怎么解释以上现象呢,这不是矛盾么追答输入回车是告诉程序出入完毕
按回车键是告诉scanf输入结束了。如果你输入一个数后,按回车,那么根据输入的这个数
while循环的条件语句scanf(%d,&i) = =1,会进行判断,满足条件则继续执行循环体中的内容。
若你在一行内输入所有数据,则如果你用空格分开,程序就会等你按下回车告诉系统你输入完了,程序才会判断。追问scanf 语句支持一次输入多个变量?那是设定好了scanf接受多个变量吧,比如scanf(%d%d%d,&i,&j,&k)
这里设定好了,scanf运行一次只接受一个变量,我的意思是,scanf运行一次,必须要靠回车结束,但这里循环明显运行了多次,怎么只用一个回车呢追答在C语言中对数据的存储时一字节为单位的。输入输出的数据流的开始和结束仅受程序控制而不受物理符号(如 回车换行)控制。一批数据输入到内存缓冲区,然后再从缓冲区逐个的将数据送到程序数据区。追问如果这样的话,那么我取消循环,只用一个scanf,只需要输入一个元素,那肯定要回车scanf才结束,流程才会继续执行下去吧?
如果他不受回车控制,那么不输入回车,流程就会自动进行下去,那又怎么解释以上现象呢,这不是矛盾么追答输入回车是告诉程序出入完毕
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯