问题背景:
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
while(getline(cin,str))
{
char s,s2;
cin >> s;
int count = 0;
for(int i=0;i<str.size();i++)
{
if(s>='A'&& s<='Z')
s2=s+32;
else s2=s-32;
if(s == str[i])
count++;
else if(s2==str[i])
count++;
}
cout << count<<endl;
//在输入一个字符后有一个回车符在缓存中,需要忽略后面的输入
cin.ignore();//循环的时候会出问题,第二次循环读不出s,后面加上一个cin.ignore()就好了
}
}
在VS2010中调试发现,在 getline(cin,str) 后面有cin>> 时候,敲入enter,下一次循环,str的ANCS为10
符号 ASCII码 意义
\n 10 换行NL
\r 13 回车CR
总结:
1、getline 遇到换行符就停止读取,并忽略换行符。但getline 并不忽略行开头的换行符。只要 getline 遇到换行符,即便它是输入的第一个字符,getline 也将停止读入并返回。
2、cin.get()会把回车(‘\n’)当作字符读入.而cin>>则会跳过回车或空格
3、调试发现VS2010中Enter为\n
用法1: cin.get(字符变量名)可以用来接收字符
ch=cin.get();或者cin.get(ch);
**用法2:**cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
char a[20];
cin.get(a,20);
**用法3:**cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足.
cin.getline() // 接受一个字符串,可以接收空格并输出
char m[20];
cin.getline(m,5);
cout<<m<<endl;
输入:jkljkljkl
输出:jklj
接受5个字符到m中,其中最后一个为’\0’,所以只看到4个字符输出;
延伸:
cin.getline()实际上有三个参数,cin.getline(接受字符串的参数m,接受个数5,结束字符)
当第三个参数省略时,系统默认为’\0’
如果将例子中cin.getline()改为cin.getline(m,5,’a’);当输入jlkjkljkl时输出jklj,输入jkaljkljkl时,输出jk
参考:
http://blog.csdn.net/dcj0913/article/details/39058555
http://blog.sina.com.cn/s/blog_868a5fbd0100vz8f.html