cin对象的>>运算符返回的是NULL 当然可以不满足while的条件跳出,
scanf返回输入有效字符个数
接收到EOF返回EOF,EOF是-1,于是while( scanf("%d",&a) )呆在循环里不退出来了。
所以写while(cin>>a) 与 while( ~scanf("%d",&a) )才是文件读入结束,即scanf的!=EOF(-1)
(1)scanf
1.1 scanf 输入字符时,会将'\n'、空格吸收,即可将它俩赋值给变量。
1.2 scanf 输入字符串时,遇到空格或者回车就代表结束
输入一个字符串,如果在这之前有空格或回车,空格和回车不会给字符串。遇到下一个空格或回车才代表结束
而gets()会将回车给字符串
1.3 读一行字符,可以用gets();
(2)cin
cin用法很简单,如果输入的是一个字符,那么,'\n'、空格不会被吸收, 其他的情况和scanf差不多
这个循环不会结束:
char c[7],d;
int i=0;
while(cin>>d)
{
c[i++]=d;
}
所以要在里加if(d=='\n')break;
(3)如果用gets()或者getline(),那么它一遇到'\n'就结束,比如定义 char c; char s[10]; scanf("%c", &c);gets(s);printf("%c\n", c);printf("%s",s);
gets()接受到回车后将回车符转为NULL,在末尾添加‘\0’,作为结束 (回车符不在缓冲区)
如果一输入一个字符想给c,然后回车在下一行输入一行字符串给s;那么输出的时候会发现,第一行是字符c,第二行是个空行, 光标在第三行;
分析:输入的第一个字符给了c,然后回车'\n',这个回车代表了s是个空串(很神奇),同时,如果在输入一个字符c之后,按两个空格再加一个字符a再回车,那么s包含的就是两个空格字符加字符a,在结束
还发现,如果定义 char c[10]; char s[10]; scanf("%s", c);gets(s);printf("%s\n", c);printf("%s",s);
输入asd SS
结果输出的是
asd
__SS(前面有有两个空格)
表明输入asd加个空格表示c字符串结束时,这个空格同时给了字符串s。。。
(4)如果定义的是字符数组 char c[10],那么读入一行只能用gets(),不能用getline();可以用cout输出字符数组,也可以用printf()输出;
如果定义string s;
输入不能用gets(),只能用getline();
输出不能用printf(),只能用cout;