本人认为数据处理是非常重要的,如果能在输入时候进行处理会省下很多事情。
关于scanf这里整理了一下:
1:从scanf()角度看输入
如果使用%d说明符,scanf()函数开始每次读取一个输入字符,它跳过空白字符(空格,制表符和换行符)直到遇到一个非空白字符,并持续读取和保存字符直到它遇到一个非数字的字符。
如果使用%s说明符,那么空白字符以外的所有字符都是可接受的,所以scanf()跳过空白字符直到遇到第一个非空白字符,然后保存再次遇到空白字符之前的所有非空白字符。这就意味着%s使scanf()读取一个单词。scanf()在字段的结尾或者第一个空白字符处停止(比如"%10s"如果输入I am happy那么读取到的就是只有一个单词"I",而不是10个字符的长度,尽管字段宽度是10)。最后一点:当scan()把字符串放在一个指定的数组中时,它添加终止的'\0'使得数组内容成为一个C字符串。
如果使用%c说明符,那么所有的输入字符都是平等的。如果下一个输入字符是一个空格或者换行符,将会把这个空格或换行符赋给指定的变量;不会跳过空白字符。
2:格式字符串中的常规字符
scanf("%d, %d",&n,&m);
即输入一个数字,一个逗号,一个数字。如:
88,121
或者
88,
121
格式字符串中的空格意味着跳过下一个输入项之前的任何空格。例如下面语句
scanf("%d, %d",&n,&m);
将会接受下列任何一个输入行:
88,121
88 , 121
88, 121
注意,“任何空格”的概念包括没有空格的特殊情况。
2:scanf 的返回值
scanf()函数返回成功读入的项目的个数,scanf 的返回值可以分成三种情况:
(1)正整数 , 表示正确输入参数的个数。例如执行 scanf ("%d %d", &a, &b); 如果用户输入"3 4",可以正确输入并返回2(正确输入了两个变量);如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量)。
(2) 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。
(3)EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车,就表示输入结束;
如 scanf("%d%d",&a,%b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0 如果遇到错误或遇到end of file,返回值为EOF。
关于cin的返回值
其实这么说有点错误的,因为cin是个对象,没有所谓返回值之说,一般来说其他对象重载了>>操作符,才有了所谓的返回值,很多时候>>输入操作符返回流对象的引用,cin >> x 返回istream&,cout << x返回oostream&,暂且不说对象,就说c++的内嵌类型,如int,char之类的。
我们可以看到的现象是这样的:
1.if可直接判断流,如if (cin),while可以间接判断(判断为bool型),如while (cin >> x)
2.若流被标记错误(读取失败)就返回false,也就是0。
3.键入EOF时,while(cin>>str){}会退出,其中str为string。
4.当在缓冲区读取到的数据与>>后面的变量类型不匹配的时候,就会结束。比如说a,b是int的,你如果在下面的cin>>里面输入的是非int的(比如说是'a'或其它)就会结束。