删除全部大写/小写的单词。 C++
该程序读取一个文件,如果用户添加一个参数上限或下限,它将删除全部大写或全部小写的单词。删除全部大写/小写的单词。 C++
即。 “Hello World ....你好世界....你好世界”
'upper word'会输出“Hello World .... .... hello world”
'lower word'would output“Hello世界....你好世界....“
截至目前为止我的代码确实脱掉了大写字母,但假定只有在下面的字符不是大写字母时才会断开循环。
问题是,如果它的字符串像“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。 !! (不)将首先被应用,所以条件基本上是“如果它不是标点或它不是空格”。既然它不能既是标点又是空格,这总是如此。我认为你想要做的是检查角色是否是标点符号或空格以外的东西。你可以这样做
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”。您可以添加另一个内循环来从当前字符向后读取,以防止出现这种情况。
编辑:如果语句改为while循环,因为我忘记了删除其他字符的索引上的字符的效果。
我得到它的逻辑,谢谢,但是我得到了一个“下标范围“,我希望能弄清楚。并感谢您指出|| &&问题。 – Nate
啊,这可能是因为内循环。尝试拉动copyText [i + j]而不检查i + j
你可以做以下步骤:
-
std::regex_iterator通过模式
\\w+
收集的话。 std::match_results店铺位置&比赛时长。 - std::all_of + std::isupper/std::islower检测大写/小写字。
- std::basic_string::erase逐个删除单词(不要忘记每次删除后更新位置偏移量)。
这个选项也在我脑海中激荡。我想计算大写字母,然后计算有多少字母,然后比较,如果它们是相同的删除子字符串。只是无法弄清楚语法。谢谢! – Nate
我不明白示例输入和预期输出。 –
哦,对不起。这只是该计划的一部分。还有其他功能。 copyText是txt文件(它是输入)的副本,输出在最后是一个cout。所以它不会直接改变txt文件,只是临时的copyText。 – Nate
'std :: regex_replace(copyText,std :: regex {“\\ b [AZ] * \\ b”},“”);' – user657267