北海365信息分类

C语言 多组输入 多种输入---归纳总结笔记

C语言 多组输入 多种输入---归纳总结笔记

ACM竞赛的输入输出数据一般都有多组(不定),并且格式多样(数,字符,字符串..)因此处理多组数据是基本要求这里除了雨巨介绍的,还整理了其他方法,分类做一下笔记省得我忘记

第一类 不说明有几组输入,以EOF为结束标志 EOF(文件结束符)是c语言预定义的常量,值为-1,表示文件结束在 Windows系统中 在新的一行的开头 Ctrl+Z 就表示 EOF

第一种

while(scanf(%d %d)!=EOF)scanf()函数返回值为成功读取数据个数(比如上行成功读取了2个数,返回值为2)当未读取到数据时返回EOF

因此也可以这么写第二种

while(scanf(%d %d)==2)第三种

while(cin >> n)如果输入流正常,就会继续循环获取值,如果输入流错误,或者达到文件末尾(EOF),循环结束第四种

while(~scanf("%d, &n)) ~ 是按位取反,EOF值为-1100000000000000000000000000000001-原码11111111111111111111111111111111111110-反码11111111111111111111111111111111111111-补码计算机储存的是补码,EOF的补码按位取反后结果为000000000000000000000000000000000为假,循环停止,非0为真,循环继续

第二类 输入一开始告诉你有n组数据,后面跟着n组数据 例:

这个好耶 先输入n再写个循环读取n组数据就行了

scanf("%d",&n); //或cin >> n;

while(n--) //或for(i=0;i

{

...

} 第三类 不说明有几组输入,但以某个特殊输入为结束标志 例: 以0 0为结束标志写成一行容易写错成

while(scanf("%d %d",&a,&b)==2 && (a!=0 && b!=0))//错误代码读到2个都是0就结束的逆否命题是只要有1个不是0就不结束因此上行代码中&&应改成||,如下

while(scanf("%d %d",&a,&b)==2 && (a!=0 || b!=0))//正确代码&&在while()括号里面的应是特殊条件的逆否命题,但得出逆否命题很容易出错更万无一失的写法是把特殊条件的原命题写在循环内部,如下

while(scanf("%d %d",&a,&b)==2)

{

if(a==0 && b==0) break;

...

}这样写多了一行,但写原命题不会出错吧(大概)

第四类 以上三类的结合 懒得写了

第五类 输入是整行字符串(或单个字符) C语法:

char a[20];

gets(a); //雨巨:"gets在c++14以后的标准里面被禁用了,不安全,某些oj会ce."C++语法:

char a[20];

cin.getline (a,20);或者使用string类型(头文件记得包含#include )

string a;

getline (cin,a); PS:若使用scanf()函数

scanf(%s%s”,str1,str2)在多个字符串之间用一个或多个空格作分隔

若使用gets()函数

gets(str1); gets(str2);在多个字符串之间用回车符作分隔

通常接受短字符串用scanf()函数,接受长字符串用gets()函数

getchar()每次只接受一个字符,常用a = getchar();

笔记整理自雨巨,lcy老师等大牛

欢迎大佬补充

相关推荐

beat365官方app下载手机版 喆喆兔简介
北海365信息分类 u盘哪里有卖?十大靠谱购买渠道推荐
北海365信息分类 25千克等于多少斤