如何找出排队的字数?我现在用你计算有多少空格的方法。但是,如果有人击中2个空格或开始与空间对齐,那该怎么办呢。
还有其他或更聪明的方法来解决这个问题吗?
我的解决方法或代码方式有什么评论吗?
我解决了这个问题:#include <iostream>
#include <cctype>
#include <cstring>
using namespace std;
int main( )
{
char str[80];
cout << "Enter a string: ";
cin.getline(str,80);
int len;
len=strlen(str);
int words = 0;
for(int i = 0; str[i] != '\0'; i++) //is space after character
{
if (isalpha(str[i]))
{
if(isspace(str[i+1]))
words++;
}
}
if(isalpha(str[len]))
{
words++;
}
cout << "The number of words = " << words+1 << endl;
return 0;
}
答案 0 :(得分:2)
std one-liner是:
words= distance(istream_iterator<string>(istringstream(str)), istream_iterator<string>());
答案 1 :(得分:0)
流跳过空格(也是多个)。
所以,如果你做了类似的事情:
string word;
int numWords = 0;
while (cin >> word) ++numWords;
这应该计算简单案例的单词数量(不考虑单词的格式是什么,跳过空格)。
如果你想要每行,你可以首先读取该行,从字符串创建一个流,并做类似的事情:
string line, word;
int wordCount = 0;
getline(cin, line);
stringstream lineStream(line);
while (lineStream >> word) ++wordCount;
你不应该使用cin.getline
并且应该更喜欢自由函数std::getline
,它接受一个可以长大的字符串并防止堆栈溢出(lol)。坚持自由功能,以提高安全性。
答案 2 :(得分:0)
首先,您需要一个非常具体的“单词”定义。大多数答案的计数与您的尝试略有不同,因为您使用的是对单词构成的不同定义。您的示例特别需要在某些位置使用字母字符。基于流的答案将允许任何非空格字符成为单词的一部分。
一般的解决方案是提出一个单词的精确定义,将其转换为正则表达式或有限状态机,然后计算匹配的每个实例。
这是一个示例状态机解决方案:
std::size_t CountWords(const std::string &line) {
std::size_t count = 0;
enum { between_words, in_word } state = between_words;
for (const auto c : line) {
switch (state) {
case between_words:
if (std::isalpha(c)) {
state = in_word;
++count;
}
break;
case in_word:
if (std::isspace(c)) state = between_words;
break;
}
}
return count;
}
要考虑的一些测试用例(并突出显示单词定义之间的差异):
""
空字符串" "
只是空格"a"
" one "
"count two"
"hyphenated-word"
"\"That's Crazy!\" she said."
字母与相邻空格之间的标点符号"the answer is 42"
数字应算作单词吗?