我正试图从一个段落中找出一个句子(用点分隔)中的最大字数。我完全陷入了如何排序和输出到stdout的困境。
例如:给定一个字符串S:{“拆分字符串的程序。使用自定义拆分函数。在C++中"};
预期输出应为:5
#define max 8 // define the max string
string strings[max]; // define max string
string words[max];
int count = 0;
void split (string str, char seperator) // custom split() function
{
int currIndex = 0, i = 0;
int startIndex = 0, endIndex = 0;
while (i <= str.size())
{
if (str[i] == seperator || i == str.size())
{
endIndex = i;
string subStr = "";
subStr.append(str, startIndex, endIndex - startIndex);
strings[currIndex] = subStr;
currIndex += 1;
startIndex = endIndex + 1;
}
i++;
}
}
void countWords(string str) // Count The words
{
int count = 0, i;
for (i = 0; str[i] != '\0';i++)
{
if (str[i] == ' ')
count++;
}
cout << "\n- Number of words in the string are: " << count +1 <<" -";
}
//Sort the array in descending order by the number of words
void sortByWordNumber(int num[30])
{
/* CODE str::sort? std::*/
}
int main()
{
string str = "Program to split strings. By using custom split function. In C++";
char seperator = '.'; // dot
int numberOfWords;
split(str, seperator);
cout <<" The split string is: ";
for (int i = 0; i < max; i++)
{
cout << "\n initial array index: " << i << " " << strings[i];
countWords(strings[i]);
}
return 0;
}
countWords()中的Count + 1仅在第一个结果上正确给出数字,然后将““空格添加到单词计数中。
请考虑先用最容易理解的解决方案来回答。(std::sort,创建一个新函数,lambda)
4条答案
按热度按时间svgewumm1#
您的代码没有意义。例如,以下声明的含义
还不清楚。
并且为了找到一个段落的句子中的最大单词数,不需要根据单词数对句子本身进行排序。
如果我没有理解错的话,你需要的是类似下面这样的东西。
如果要进入段落
则输出将为
如果你还不熟悉字符串流,那么你可以使用成员函数
find
,find_first_of
,find_first_not_of
和类型为std::string
的对象来将字符串拆分成句子,并计算句子中的单词数。dojqjjoe2#
你的用例听起来像是一个约简。本质上你可以有一个状态机(解析器),当它遇到单词和句子分隔符时,它会遍历字符串并更新一些状态(例如计数器)。应该特别注意极端情况,例如当有连续的多个空格或〉1个连续的句号(
.
)时。处理这些情况的约简如下所示:Demo
棘手的是如何处理退化的情况,例如,
"This is a , ,tricky .. .. string to count"
的输出应该是什么,其中不同类型的分隔符以任意方式交替。解析逻辑的状态机实现允许您轻松地调整解决方案(例如,您可以向解析器传递一个“忽略列表”,并更新默认情况,以便在c
属于该列表时不重置in_space
变量)。xcitsw883#
g9icjywg4#
JavaScript解决方案