【问题标题】:counting number of words in a string计算字符串中的单词数
【发布时间】:2021-08-29 20:41:21
【问题描述】:

我是这里的新手。我正在尝试创建一个函数来计算字符串中的单词,但是我正常的猿脑不允许我进一步思考。你们能看看我的工作并给我一些指导吗?

int numWords(string wordnum, ){
    int counting = 0;
    int space = 0;
    
    while(int i<wordnum.length()){
        
        if(wordnum[i] == " " && wordnum[i] == "\n"){
            space=0;
        }
        else if(space ==0){
            space = 1;
            counting++;  
        }

【问题讨论】:

  • 这段代码有很多错误。函数的 1 参数列表中的逗号是语法错误。 while 循环中的 int 是语法错误。将 charconst char* 进行比较是语法错误。认为一个字符可以同时是空格和换行符是一个逻辑错误。

标签: c++ counting word


【解决方案1】:

如果单词用空格分隔,只需使用std::stringstream 和while 循环:

#include <sstream>
#include <string>
#include <iostream>

int numWords(std::string wordnum)
{
  int counting = 0;
  std::string word;
  std::stringstream strm(wordnum);

  while (strm >> word)
    ++counting;
  return counting;
}

int main()
{
   std::cout << numWords("The number of words");
}

输出:

4

【讨论】:

  • 什么是从用户输入中计算单词的好方法,而不是给定字符串?
  • 输入的来源有什么不同? numWords 是一个不关心数据来自哪里的函数,只要你给它一个std::stringstd::string 可能是硬编码的,从输入中获取,从文件中获取,与 numWords 无关。
  • 有趣的测试用例也包含非字母字符,例如“*** Hello World *** !” . . . .
【解决方案2】:

最好使用 for 循环而不是 while 循环来遍历代码,因为每次迭代循环时都会增加索引。另一个错误是您使用了"" 括号来查看循环中的索引字符是换行符还是空格。这不起作用,就像您索引字符串的字符一样,它将返回char 而不是char*string'' 括号用于chars。我在 cmets 中看到您还想添加输入,因此作为一项额外功能,我使用 getline 命令添加了该功能。我建议您阅读有关如何开始的基本 C++ 书籍/教程,因为您的代码有很多语法错误。

#include <iostream>
#include <string>

using namespace std;

int numWords(string wordnum) {
    int counting = 0;
    int space = 0;
    bool waiting = false;
    if(wordnum[0] != ' ' && wordnum[0] != '\n') {
        space++;
    }
    for(counting = 0; counting < wordnum.length(); counting++) {
        if(wordnum[counting] == ' ' || wordnum[counting] == '\n') {
            waiting = true;
        }
        if(waiting == true && wordnum[counting] != ' ' && wordnum[counting] != '\n') {
            waiting = false;
            space++;
        }
    }
    return space;
}

int main() {
    string example;
    getline(cin, example);
    cout << "Number of words: " << numWords(example) << endl;
} 

【讨论】:

    【解决方案3】:

    确实有很多不同的可能解决方案。

    一个想法是,将一个单词视为容器中的一个元素,在这种情况下是一个字符串。通过iterators,我们可以遍历容器中的元素。

    一个很好的 iterator 迭代字符串中的元素是 std::sregex_token_iterator。在这里,您可以使用 std::regex 为要迭代的元素定义模式。

    并且在std::distance的帮助下,您可以测量2个迭代器范围内的元素数量。

    所有这些粘在一起会给你一个典型的单衬:

    #include <iostream>
    #include <string>
    #include <regex>
    #include <algorithm>
    #include <iterator>
    
    const std::regex re{ R"(\w+)" };
    const std::string text{ R"(Lorem ipsum dolor sit amet, consetetur sadipscing elitr, 
    sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, 
    sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. 
    Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 
    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 
    tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero 
    eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea 
    takimata sanctus est Lorem ipsum dolor sit amet.)" };
    
    int main() {
    
        // Output the number of words
        std::cout << "\n\nNumber of words in text: "
    
            << std::distance(std::sregex_token_iterator(text.begin(), text.end(), re), {})
    
            << "\n\n";
    
        return 0;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多