题目描述
统计给定文本文件中汉字的个数。
Input
输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本。
Output
对于每一段文本,输出其中的汉字的个数,每个测试实例的输出占一行。
[Hint:]从汉字机内码的特点考虑~
输入样例:
2
WaHaHa! WaHaHa! 今年过节不说话要说只说普通话WaHaHa! WaHaHa!
马上就要期末考试了Are you ready?
输出样例:
14
9
读完题干,首先想到的是肯定用字符串读入,然后就是挨个字遍历.
遍历的条件是啥的,就想到了除了ASCII表之外的字符就是汉字白,
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
string s;
cin>>n;
getchar();
while(n--)
{
int cnt=0;
getline(cin,s);
for(int i=0;i<s.size();++i)
if(!(s[i]<=127&&s[i]>=0))
cnt++;
cout<<cnt<<endl;
}
return 0;
}
但是输出的结果是正确答案的两倍,试着将cnt/2后提交Accept了.
那这是为啥呢?
做这个题时还暴露出一个问题:
cin和getline()搭配使用时中间要加上getchar().
拿这个题为例:
刚开始代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
string s;
cin>>n;
while(n--)
{
int cnt=0;
getline(cin,s);
for(int i=0;i<s.size();++i)
if(!(s[i]<=127&&s[i]>=0))
cnt++;
cout<<cnt/2<<endl;
}
return 0;
}
调试样例时:
为什么输入2按回车后立马输出个0,正常不应该是换行等待输入吗?这是为啥呢?、
因为输入2后的回车被while()中第一个getline给读进去了,所以输出的是0.
所以在cin>>n
后加上个getchar()
来读掉2后边的回车。
那为什么while()中的第一个getline()后边的getline()不读前边输入字符的回车呢?
这是因为,getline()在读入的时候会把末尾的回车读到字符串里边,然后再给处理掉.