在scanf中输入一行数据中间空空格隔开或者制表符隔开,然后采用循环读入的方法可以实现一行数据的读取。
输入格式: 输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
输出格式: 在一行中输出正整数序列中奇数的和。
#include <stdio.h> int main(){ int sum=0, n=-1; while(1){ scanf("%d", &n); if(n<=0){ break; } if(n%2==1){ sum += n; } } printf("%d\n", sum); return 0; }**这里口头描述一下,输入2 5 3 7 9 -1或者 2 5 3 7 1 -1 这两种方式效果相同。
这里我用分步调试测试过,当运行到scanf时,进入命令行可以输入上述形式, 在按下回车之前这些数据都是存在于键盘缓冲区,回车之后就如stdio缓冲区,但是如程序格式表示每次仅读取一个整形数据,遇到空格、回车(第二种输入方式)、制表符默认当前数据结束,所以说不管每个数据是个位数还是几千几万的数,scanf都会在扫描到上述三种数据时认为当前数据结束。 再次循环开始后,因为scanf扫描到stdio缓冲区中仍然存在数据,就不会再次运行到这一条语句时阻塞,等待命令行输入。再次读取数据前会跳过所有空格、制表符、换行,读取下一个整形数据。 这里应该在循环中加入判断结束语句 这里在引用另外一个兄弟的代码加深理解一下 **
#include <stdio.h> int main() { char str[80]; char str1[80]; char str2[80]; scanf("%s",str);/*此处输入:I love you! */ printf("%s",str); sleep(5);/*这里等待5秒,告诉你程序运行到什么地方*/ scanf("%s",str1);/*这两句无需你再输入,是对键盘盘缓冲区再扫描 */ scanf("%s",str2);/*这两句无需你再输入,是对键盘盘缓冲区再扫描 */ printf("/n%s",str1); printf("/n%s",str2); return 0; } //这里这个兄弟说是扫描键盘缓冲区,这个问题有待商榷,重点在于再次运行到scanf时不会阻塞在命令行。对于%c或%s怎样运作,我研究一下在更新。
