C++ 删除所有大写/小写的单词。C++;
程序读取一个文件,如果用户添加一个大写或小写参数,它将删除所有大写或小写的单词 比如“你好世界……你好世界……你好世界” “upper word”将输出“Hello World…….Hello World”C++ 删除所有大写/小写的单词。C++;,c++,uppercase,C++,Uppercase,程序读取一个文件,如果用户添加一个大写或小写参数,它将删除所有大写或小写的单词 比如“你好世界……你好世界……你好世界” “upper word”将输出“Hello World…….Hello World” “lower word”将输出“Hello World….Hello World….” 到目前为止,我的代码确实去掉了大写字母,但假设只有在以下字符不是大写字母时,它才会中断循环 问题是,如果它是一个类似“AABBaabb”的字符串,程序应该忽略它,因为它混合了大小写。相反,它将打印“Baa
“lower word”将输出“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);
}
}
}
for(int i=0;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);
}
}
for(int i=0;i
现在,如果这是我想要的,它会解决你的问题,但是它在任何情况下都不会起作用。例如,考虑“Abababb”这个词。算法将开始读第一个大写字母,读到结尾,决定删除这个字符。你只剩下“AABB”。。您可以添加另一个内部for循环以从当前字符向后读取,以防止出现这种情况
编辑:将if语句更改为while循环,因为我忘记了删除字符对其他字符索引的影响。您可以执行以下步骤:
\\w+
。存储匹配的位置和长度我不理解示例输入和预期输出。哦,抱歉。这只是程序的一部分。还有其他功能。copyText是txt文件(即输入)的副本,输出是结尾的一个cout。因此它不是直接更改txt文件,只是临时copyText。
std::regex_替换(copyText,std::regex{\\b[A-Z]*\\b“},””;
我知道了它的逻辑,谢谢,但我得到了一个“下标超出范围”,我很有希望能找到。谢谢你指出了| |&&问题。啊,那可能是因为内部for循环。尝试在不检查I+j