C到C++的输入方式

/ 0评 / 0

Tips

C语言输入函数

C++输入函数

bool eof(); 判断输入流是否结束
int peek(); 返回下一个字符,但不从流中去掉.
istream & putback(char c); 将字符ch放回输入流
istream & ignore( int nCount = 1, int delim = EOF ); 从流中删掉最多nCount个字符,遇到EOF时结束。

cin>>

结束条件:[enter],[space],[tab]
处理方法:cin遇到缓冲区中的[enter],[space],[tab]会结束当前输入,不会移除[enter],[space],[tab],继续下一项输入,当有连续[space],[enter,[tab]也只是将其放回缓冲区。
利用ios::sync_with_stdio(false);取消cin与stdin的同步可以更加快。

cin.getline

接受一个字符串,可以接收空格并输出。

char src[18];
cin.getline(src, 5);
cin.getline(src, 5, 'a');

结束条件:超过数量限制,输入[enter],或者输入自定义终止符。
处理方法:若超过限制,则其余字符不做处理。若输入[enter]或输入自定义终止符则移除(取其一)。
第一个函数默认只接收char*地址,且限制在4个字符以内。第5个是0。若输入1234回车,超过限制字符,cin.getline会把n从流中移除,输入其他字符则不会被移除。
第二个函数:结束条件为a与上述一致,直到输入a终止,此时a会被移除,n会继续留在流中。或者超过限制数量时,剩余的字符留在流中。
显然因为规定了限制数量,不会越界,比gets好多了。

cin.get

结束条件:输入字符足够后回车。或者输入自定义终止符。
函数的返回值就是读入的字符。 若遇到输入流中的文件结束符,则函数值返回文件结束标志EOF(End Of File),一般以-1代表EOF,用-1而不用0或正值,是考虑到不与字符的ASCII代码混淆,但不同的C++系统所用的EOF值有可能不同。

char ch;
char src[18];
cin.get(ch);
cin.get(src, 5);
cin.get(src, 5, 'a');

第一个函数接受任意字符与getchar类似。
第二、三个函数与cin.getline类似。
显然不会越界。

cin.getline 与 cin.get 的区别

cin.get(arrayname,size)当遇到[enter]时会结束目前输入,不会删除缓冲区中的[enter]
cin.getline(arrayname,size)当遇到[enter]时会结束当前输入,会删除缓冲区中的[enter]

cin.get(arrayname,size,s)当遇到s时会结束输入,不会删除缓冲区中的s
cin.getline(arrayname,size,s)当遇到s时会结束输入,并把s从缓冲区中删除

getline()

需要#incldue < string >

string s;
getline(cin, s);
getline(cin, s, 'a');
// input    -    获取数据来源的流
// str    -    放置数据的目标 string
// delim    -    分隔字符

适用于string类,和cin.getline一样会移除终止的[enter](第一个函数),或者移除a(第二个函数)。
(用std::basic_istream::operator>>释出)

从scanf说起

scanf("",)

1. %d格式输入,默认分隔符是所有的 white-spaces(空格、回车、制表);

2. %c格式输入,则按ASCII字符考虑,无分隔符。可能会受到之前输入的影响,必要时用fflush(stdin);清除缓冲区;

3. %s 是 字符串格式,默认分隔符是所有的 white-spaces,输入后自动加入结束符"\0"。

scanf函数的与后面的是必须严格匹配的。注意,是严格匹配,可以说不能有丝毫差别,但对于连续多个空格可以等同于一个空格。如:

scanf("%d, %d", &num1, &num2);  
scanf("%d,%d", &num1, &num2);  

第一条要想输入正确,必须输入一个整数,然后输入一个逗号(,),之后是第二个整数。最后是回车结束。
第二条语句中的中的两个%d之间没有空格,如果此时输入:12 ,13回车(12后面先有一个空格后由逗号),那么num2并不等于13。反过来,输入:“12”、“,”、“空格”、“13”,则不会出现错误。(自动跳过whitespace)

scanf("%d %d", &i, &j);

返回值是成功读取变量的个数,如果输入8 8.1 返回1,输入8 d返回1,输入d 8返回0。出错时则返回EOF。

scanf(" %c",&ch); 

%c是个较为特殊的说明符。 %c前没空格,scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()则读取标准输入流中第一个非空白字符。

scanf("%[A-Z]", s); //输入除A到Z的任何字符(包括空格、回车)都会停止。
scanf("%[^A-Z]", s);
scanf("%[^\n]", s);

第一条的意思是读入一个字符集合。[ ]是个集合的标志,%[ ]特指读入此集合所限定的那些字符,比如%[A-Z]是输入大写字母,一旦遇到不在此集合的字符便停止。
如果集合的第一个字符是“^”,这说明读取不在"^"后面集合的字符,即遇到"^"后面集合的字符便停止。如第二条,为大写字母就停止。
第三天遇到回车停止。

scanf("%d ", &num);/*scanf("%d\n", &num);*/  

输入一个整数后,无论在输入多少个空格、回车、Tab,都没有输出;但是当再次输入非空白字符时,如输入2 然后输入空格然后输入4,最后输入回车,则会有输出。

scanf("%s", &s)

%s默认分隔符是所有的 white-spaces,输入后自动加入结束符"0",使其成为一个字符串(之所以加上0,是和字符数组char[]的结束符有关的,C中是没有string这个类型的,是使用char[]结构实现字符串)。值得注意的是,即使输入字符的长度足够,%s是宁愿舍弃输入字符,也要把/0加上去的,作为字符串的结束。并且,scanf会忽略缓冲区开头的空格,直到遇到一个非空格字符,才开始向内存中读取数据。
想要输入”The C Programming Language.n”中间的空格怎么处理呢?
其中一个解决方法是使用gets函数,这个函数是以回车符作为输入结束的标志的;还有一种解决方式是:

scanf("%[^\n]", str);

scanf之后就可以将char[]转换为string,以防oj不对cin进行优化导致速度变慢的问题。

发表评论

电子邮件地址不会被公开。 必填项已用*标注