题目
编写一个c++程序,计算字符串中的单词数。每当遇到从空白到非空白字符的转换时,就会遇到单词。字符串只包含由空格分隔的单词。
遇到的困难
一开始感觉这题没啥特别的,比较简单,但是遇到了个坑(原本的代码如下):
#include <string>
#include <iostream>
using namespace std;
int main(){
string s;
cout << "请输入一句话(以空格分割单词):";
cin >> s;
int count = 0;
for(int i = 0; i <= s.size(); i++){
if(s[i] == ' '){
count += 1;
}
}
cout << "这句话有" << count+1 << "个单词";
return 0;
}
结果输出是一个错误的答案:
参考了网络上的一些资料发现:
cin
读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。意味着一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。
#include <string>
#include <iostream>
using namespace std;
int main(){
string s;
cout << "请输入一句话(以空格分割单词):";
cin >> s;
int count = 0;
for(int i = 0; i <= s.size(); i++){
cout << s[i];
}
return 0;
}
输出如下:
可见字符串在出现空格后停止读取,故只打印出hello
解决方法:
使用getline()
函数可以使cin
读取出空格等字符串
参考文章:C++ getline函数用法详解
最终代码
#include <string>
#include <iostream>
using namespace std;
int main(){
string s;
cout << "请输入一句话(以空格分割单词):";
getline(cin, s);
int count = 0;
for(int i = 0; i <= s.size(); i++){
if(s[i] == ' '){
count += 1;
}
}
cout << "这句话有" << count+1 << "个单词"; // 单词数比空格多1
return 0;
}
输出: