关于C++primer上 一路数 空格 换行 个数的题 可是给的答案没有办法实现

关于C++primer上 一道数 空格 换行 个数的题 可是给的答案没有办法实现啊
求大神帮我看看啊怎么把空格 换行 cin到ch里面呢
怎么实现呢



#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
unsigned acnt = 0, ecnt = 0, icnt = 0, ocnt = 0, ucnt = 0;
unsigned spacecnt = 0, tabcnt = 0, newlinecnt = 0;
char ch;
while (cin >> ch){
switch (ch){
case ' ':++spacecnt; break;
case '\t':++tabcnt; break;
case '\n':++newlinecnt; break;

}
}
cout << "space:" << spacecnt << endl;
cout << "tab:" << tabcnt << endl;
cout << "Newline:" << newlinecnt << endl;

}
 
------解决思路----------------------
2#正解,楼主可以看一下C++ primer里关于字符串的那一章,cin.get()是从输入流中读入字符串一直到换行符'\n',所以在输入space或者Tab建后,输入流中有两个字符‘\t’+'\n'或者' '+'\n',while()循环读取输入流,首先获取前一字符,此时到达'\n'处,但get()没有丢弃该换行符,而是将其留在输入流中,下一轮读取时先读取'\n',这样就会计算一次Enter键的输入。下面是我运行的代码,在switch中加入输出方便单步是查看执行过程,建议楼主自己运行下就知道了。关于cin.get()在C++primer里有很详细的解释,看了就动懂。
#include<iostream>
#include<string>
using std::cout;//不推荐使用using namespace std编译指令,用到哪个声明哪个。
int main()
{
unsigned acnt = 0, ecnt = 0, icnt = 0, ocnt = 0, ucnt = 0;
unsigned spacecnt = 0, tabcnt = 0, newlinecnt = 0;
char ch;

while (cin.get(ch))
{
switch (ch)
{
case ' ':
++spacecnt; 
cout << "space" << endl;//设置输出,查看过程
break;
case '\t':
++tabcnt;
cout << "Tab" << endl;
break;
case '\n':
++newlinecnt; 
cout << "Enter" << endl;
break;
}
if (ch == 'q')
break;
}
cout << "space:" << spacecnt << endl;
cout << "tab:" << tabcnt << endl;
cout << "Newline:" << newlinecnt << endl;
return 0;

}