程序读取一个文件,如果用户在上面或下面添加一个参数,它将删除全部大写或全部小写的单词。
即。 “Hello World .... HELLO WORLD .... hello world”
'上面的单词'会输出“Hello World .... .... hello world”
'低级字'将输出“Hello World .... 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);
}
}
}
答案 0 :(得分:1)
首先,第一个if语句中的条件将始终求值为True。的! (不)将首先应用,因此条件基本上是“如果它不是标点符号或它不是空格”。由于它不能同时是标点符号和空格,因此总是如此。我认为你要做的是检查角色是否是标点符号或空格以外的东西。你可以这样做
if(!(ispunct(copyText[i]) || isspace(copyText[i])))
或者这个。
if(!ispunct(copyText[i]) && !isspace(copyText[i]))
你的while循环正在做的是,只要copyText [i]是大写或数字,如果VERY NEXT字符 - 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循环,因为我忘记了删除其他字符索引上的字符的效果。
答案 1 :(得分:0)
您可以执行以下步骤:
\\w+
收集字词。 std::match_results存储位置&amp;比赛的长度。