关于字符读入(一)
首先,我们约定以下定义:
char c;
char ch[10];
string s;
int i;
1.gets(ch)。
其中ch为字符数组。
gets读入至回车结束。gets()会读入回车,但ch不存入回车。
如果读入行的字符总长度小于ch的总长度,则后面加"";等于则不加,也不会出错;如果大于,显然会溢出,这个会有什么后果,就看人品了(与具体环境有关)……所以数组尽量开得比题目要求的大一点点,人品会好不止一点点。
这是C中使用的。
2.getline(cin,s,c)
第一个参数cin为输入流(一般为cin)。第二个参数s为字符串,即string类成员。第三个参数c为读入的终止字符,字符型。
其重载函数getline(cin,s)默认终止字符为回车"\n"。
getline()会读入终止符,但不会存入终止符。
这是C++中string头文件中定义的函数,用于string类。
3.cin.getline(ch,i,c)
第一个参数ch为字符数组。第二个参数i为要读入字符串的最大长度(i不记得是整形还是长整形)。第三个参数c为读入的终止字符,字符型。
其重载函数cin.getline(ch,i)默认终止字符为回车"\n"。
cin.getline()最多会读取(i-1)个字符,使得最后一位总是""。
(1)如果在读入第(i-1)个字符或之前遇到终止符。cin.getline()会读入终止符,但不会存入终止符。
(2)如果在读入第(i)个字符遇到终止符。cin.getline()会读入第(i)个字符,即读入终止符,但不会存入终止符。
(3)如果在读入第(i)个字符还没遇到终止符。cin.getline()不会读入第(i)个字符。
举个例子,比如下面的代码。
cin.getline(ch,10,'p');
c=getchar();
如果输入"12345678pabc",则ch为"12345678",c为"a"。
如果输入"123456789pabc",则ch为"123456789",c为"a"。
如果输入"1234567890pabc",则ch为"123456789",c为"0"。(后面的"pabc"未读入处理)
这是C++输入流(一般是cin)的成员函数。
总结:
(1)终止符号的原则是,终止符号会被读入,但不存入。
(2)字符数组会在末尾加上""。但如果字符数组即将满了,是最后读满数组,不加"";还是保证最末尾总有""。这个显然各个函数处理不同。我不知道是不是c和c++采取两套原则。所以再说一次那句话,数组尽量开得比题目要求的大一点点,人品会好不止一点点。
(3)其实本来c++的string是很好用的,可是偏偏c风格的字符数组比string执行速度快,偏偏ACM要求速度要快,偏偏两者速度的差异还是很可观的……所以具体什么情况采取什么,以后再总结经验。