【问题标题】:Writing a function to check if a word is valid编写一个函数来检查一个单词是否有效
【发布时间】:2020-08-13 03:31:21
【问题描述】:

我正在研究一个二叉搜索树,它从文本文件中读取,将单词更改为小写,删除标点符号并检查单词是否有效,然后存储到二叉搜索树中。

在这里,我创建了一个名为isValidWord() 的函数,用于检查单词是否为小写、是否包含任何数字以及是否包含任何标点符号。但是由于某种原因,它仍然允许将无效的单词存储到二叉搜索树中。

isValidWord() 函数

bool BST::isValidWord(string word) {

    for (int i = 0; word.size(); i++)
    {
        if (!isalnum(word[i]))
        {
            if (!isdigit(word[i])) {

                if (!ispunct(word[i])) {

                    if (!isupper(word[i])) {
                        return true;
                    }
                }
            }
            
        }
    }

    return false;

}

BST 插入功能

void BST::insert(string word, TreeNode*& root) {
    transform(word.begin(), word.end(), word.begin(), ::tolower);
    for (int i = 0, len = word.size(); i < len; i++) {

        if (ispunct(word[i])) {
            word.erase(i--, 1);
            len = word.size();
        }
    }

    if (isValidWord(word)) {
        if (root == NULL) {
            root = new TreeNode(word);
        }
        else if (root->data == word) {
            root->count++;
        }
        else {
            if (word >= root->data) {
                insert(word, root->right);
            }
            if (word <= root->data) {
                insert(word, root->left);
            }
        }
    }
}

我做错了什么我看不到吗?任何帮助将不胜感激。

【问题讨论】:

  • 最终,循环访问word[word.size()],这是一个空字符'\0'。该字符通过了所有四项检查(不是字母、不是数字,也不是标点符号),函数返回truereturn false; 语句永远无法到达。

标签: c++ function binary-search-tree


【解决方案1】:

这个问题需要std::regex的用法。

整个“isValidWord”函数可以用一个非常简单的单行代替:

if (std::regex_match(word, std::regex("[a-z]+"))) {

在括号中,您可以指定所有有效字符。例如 [a-z] 表示所有小写字符。

还有你的台词

    for (int i = 0, len = word.size(); i < len; i++) {

        if (ispunct(word[i])) {
            word.erase(i--, 1);
            len = word.size();
        }
    }

可以简单地替换为超简单的一个衬里:

word = std::regex_replace(word,  std::regex(R"([\.,:])"), "");

把你想删除的东西放在括号里。

请考虑。

如果你有问题,请询问

【讨论】:

    【解决方案2】:

    我在 for 循环中没有看到中断条件。

    for (int i = 0; word.size(); i++)
    {
    

    应该换成,

    for (int i = 0; i < word.size(); i++)
    {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 2017-09-08
      • 2023-02-02
      • 1970-01-01
      • 2017-01-31
      相关资源
      最近更新 更多