PAT甲级C/C++字符串输入问题


以下总结了一些字符串输入的问题,避免在刷算法题的过程中因为输入的问题而出现答案错误。

1.cin

对于string类型,遇空格/换行符为结束的标志,但是空格/换行符仍在缓冲区中。

2.getline(cin, str)

只适用于string类型且面向行输入,遇换行符为结束标志,且丢弃换行符

这意味着,如果从上一行的输入中留下的换行符没有被及时处理掉的话,当getline遇见换行符后,会认为此行的输入已经结束,也就意味着getline(cin,str)中的str没有得到任何的输入。

3.scanf("%s",char[])

面向char[]C风格字符串的输入,遇换行符/空格为结束的标志,且留在缓冲区中。

但与getline不同的是,如果scanf上一行的输入中有残留的空格/换行符未被处理的话,并不会影响下一句scanf读入字符串。

4.getchar()

ch=getchar()的返回值就是ch本身,所以通常可以放在if或者while条件语句中做判断语句。

5.gets()

gets()包含在头文件stdio.h中,不需要包含string.hgetsgetline是一样的,遇换行符为结束标志,且丢弃换行符

gets()本身不推荐使用,因为在没遇见换行符之间gets()的读入是不会停止的,实际应用中会有造成栈溢出的风险,但是在PAT甲级里还是可以使用的,特别是当为了避免超时而使用char[]为字符串的存储方式而非string时,且又要面向行输入,就会用到gets()

小例子:

假设现需要输入一个整数N,并跟随输入N行字符串,最后打印这N行字符串。如果这样写:

int n = 0;
string name[10];
scanf("%d", &n); //n is less than 10
for (int i = 0; i < n; i++) {
    getline(cin, name[i]);
}
for (int i = 0; i < n; i++) {
    cout << name[i] << " ";
}

假设输入为:

3
james bond
harry potter
jone snow

打印结果为:

 harry potter jone snow

你会发现,第一个输入的字符串并没有的得到打印,而只是打印了一个空格,原因在于在使用scanf读入字符串个数时,换行符留在了缓冲区中,当遇见getline时,getline碰到换行符以为读入结束了。

所以正确的写法应该是在scanf之后加上一个getchar来吸收多余的换行符。

scanf("%d", &n);
getchar();

你可能感兴趣的:(C++,c++)