删除所有大写/小写的单词.c++
Removing words that are all uppercase/lowercase. C++
程序读取一个文件,如果用户添加一个参数大写或小写,它将删除全大写或全小写的单词。
ie。"你好世界……你好世界hello world "
'upper word'将输出"Hello World.... .... "hello world"
'lower word'将输出"Hello World.... "你好世界"
到目前为止,我的代码确实去掉了大写单词,但假设只有在后面的字符不是大写的情况下才会中断循环。
问题是,如果它是一个像"AABBaabb"这样的字符串,程序应该忽略它,因为有大小写混合。相反,它将打印"Baabb"。
函数是这样的
for (int i = 0; i < copyText.length(); i++)
{
if (!ispunct(copyText[i]) || !isspace(copyText[i]))
{
while (isupper(copyText[i]) || isdigit(copyText[i]))
{
if (islower(copyText[i + 1]))
{
break;
}
else
copyText.erase(copyText.begin() + i);
}
}
}
首先,第一个if语句中的条件总是求值为True。!(not)将首先应用,所以这个条件本质上是"如果它不是标点符号或者不是空格。"因为它不能同时是标点和空格,所以这总是正确的。我认为你要做的是检查这个字符是不是标点符号或空格以外的东西。你可以这样做
if(!(ispunct(copyText[i]) || isspace(copyText[i])))
或。
if(!ispunct(copyText[i]) && !isspace(copyText[i]))
while循环所做的是,只要copyText[i]是大写或数字,如果下一个字符- copyText[i + 1] -是小写,则中断,否则删除当前字符。这就是为什么它在开始删除之前不看单词的其他部分。这是你的算法的修改版本,它可能工作,也可能不工作(我还没有测试过),但它显示了我将如何开始修改你的方法,使其功能。
for (int i = 0; i < copyText.length(); i++)
{
while (!ispunct(copyText[i]) && !isspace(copyText[i]))
{
bool delChar = True;
for (int j = 1; i+j < copyText.length(); j++) {
if (ispunct(copyText[i+j]) || isspace(copyText[i+j])
break;
if (islower(copyText[i+j]))
delChar = False;
}
if (delChar)
copyText.erase(copyText.begin() + i);
}
}
现在,如果这是我想要的,它将解决你的问题,但它仍然不是在所有情况下工作。例如,考虑单词"aabbAABB"。算法将从第一个大写字母开始读取,一直读到末尾,然后决定删除该字符。你将只剩下"aabb"。您可以添加另一个内部for循环,从当前字符向后读取,以防止这种情况。
编辑:将if语句更改为while循环,因为我忘记了删除一个字符对其他字符的索引的影响。
您可以执行以下步骤:
- std::regex_iterator按模式
\w+
收集单词。Std::match_results存储位置&匹配长度。 - std::all_of + std::isupper/std::islower检测大小写单词
- std::basic_string::erase逐个删除单词(每次删除后不要忘记更新位置偏移量)。
- 文本文件中的单词链表
- 在指针的帮助下,文本文件中单词的频率
- 如何根据单词在文本中出现的概率输出单词
- 从字符串变量中逐字符读取单词
- 使用std::mt19937从字符串中返回一个随机单词
- 如何用for循环在c++中生成单词三角形
- 将数字转换为单词
- 使用if-else将数字转换为单词
- C++-字符串是否包含一个带有简单循环的单词
- 使用单词"not"作为C ++类的名称会导致VS2019错误
- 为什么这个程序返回最后一个单词而不是最长的单词?
- 3-3. 编写一个程序来计算每个不同单词在其输入中出现的次数
- C++为一串单词添加空格
- 在C++中查找(奇怪的)字符串中的单词
- 当字符串是某个单词时给出输出?
- 当您在此单词中搜索单词时调整字符数组的大小?
- 数每个单词的元音
- 我们如何在文本文件中找到C++中的几个单词?
- 使用 BFS 的单词梯 2
- 替换字符串中的单词,但忽略引号中的单词