我正在编写的程序读取一个文本文件,将段落分成单个单词,将它们与一个"敏感单词列表进行比较"如果文本文件中的单词与敏感单词列表中的单词匹配,则会被审查。我编写了一些函数来查找每个单词的开头,并使用" @@@@@"来检查或替换敏感单词列表中的单词。 (我在这篇文章中遗漏了)。在这种情况下,一个单词是包含字母数字字符的任何字符串。
我遇到问题的功能是"提取"或返回单个单词以与敏感单词列表(extractWord)进行比较。目前它只返回句子中最后一个单词的第一个字母。所以现在所有的功能都是返回" w"。我需要所有单词。
这是我到目前为止所拥有的......
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
bool wordBeginsAt (const std::string& message, int pos);
bool isAlphanumeric (char c); //
std::string extractWord (const std::string& fromMessage, int beginningAt);
int main()
{
string word = "I need to break these words up individually. 12345 count as words";
string newWord;
for (int i = 0; i < word.length(); ++i)
{
if (wordBeginsAt(word, i))
{
newWord = extractWord(word, i);
}
}
//cout << newWord; // testing output
return 0;
}
bool wordBeginsAt (const std::string& message, int pos)
{
if(pos==0)
{return true;}
else
if (isAlphanumeric(message[pos])==true && isAlphanumeric(message[pos- 1])==false)
{
return true;
}
else
return false;
}
bool isAlphanumeric (char c)
{
return (c >= 'A' && c <= 'Z')
|| (c >= 'a' && c <= 'z')
|| (c >= '0' && c <= '9');
}
std::string extractWord (const std::string& fromMessage, int beginningAt)
{
string targetWord= "";
targetWord = targetWord + fromMessage[beginningAt];
return targetWord;
}
编辑:在尝试将targetWord用作数组(我无法定义大小)并在extractWord中使用几个不同的for和while循环后,我找到了一个解决方案:
std::string extractWord (const std::string& fromMessage, int beginningAt)
{
string targetWord= "";
while (isAlphanumeric(fromMessage[beginningAt++]))
{
targetWord = targetWord + fromMessage[beginningAt-1];
}
return targetWord;
答案 0 :(得分:2)
由于这是一个C ++问题,如何使用现代C ++,而不是使用打扮的C代码?现代C ++库具有为您实现所有这些工作所需的所有算法和功能:
#include <algorithm>
#include <cctype>
std::string paragraph;
// Somehow, figure out how to get your paragraph into this std::string, then:
auto b=paragraph.begin(), e=paragraph.end();
while (b != e)
{
// Find first alphanumeric character, using POSIX isalnum()
auto p=std::find_if(b, e, [](char c) { return isalnum(c); });
// Find the next non-alphanumeric chararacter
b=std::find_if(p, e, [](char c) { return !isalnum(c); });
if (isbadword(std::string(p, b)))
std::fill(p, b, '@');
}
这几乎与您提出的要求相同,只是手动搜索此内容的所有手动代码的一小部分。你所要做的就是弄明白......
bool isbadword(const std::string &s)
......需要这样做。
您的家庭作业是如何略微调整此代码,以避免在某些特定情况下使用空字符串调用isbadword()。