c++ - 如何从 C++ 中的字符串中删除换行符?
问题描述
我正在尝试从用户那里获取文本输入并将其与文本文件中的值列表进行比较。值是这样的:
最后那条线是光标,不是直线,不过没关系。无论如何,我按单词排序并产生值,然后检查值。分号是单词之间的分隔符。所有数据都是让代码首先工作的基础。重要的是所有数据片段后面都有换行符。无论我尝试什么,我都无法完全摆脱换行符。查看 ASCII 值说明了原因,我的努力只删除了新行,但没有删除回车。大多数时候这很好,但是在比较值时它们不会相同,因为带有回车符的值被视为更长。以下是代码的重要部分:
int pos = 0;
while (pos != std::string::npos)
{
std::string look = lookContents.substr(pos+1, lookContents.find("\n", pos + 1) - pos);
//look.erase(std::remove(look.begin(), look.end(), '\n'), look.end());
//##
for (int i = 0; i < look.length(); i++)
{
std::cout << (int)(look[i]) << " ";
}
std::cout << std::endl;
std::cout << look << ", " << words[1] << std::endl;
std::cout << look.compare(0,3,words[1]) << std::endl;
std::cout << pos << std::endl;
//##
//std::cout << look << std::endl;
if (look == words[1])
{
std::cout << pos << std::endl;
break;
}
pos = lookContents.find("\n", pos + 1);
}
//## 之间的所有内容都只是错误检查。下面是我输入 look b:2 时的输出
如您所见,这些值的末尾有 ASCII 10 和 13,这是用来创建换行符的。13 是回车,10 是换行。最后一个在代码的前面有 10 个删除,因此代码不会对空子字符串执行额外的循环。我删除换行符的努力,包括注释掉的擦除功能,要么只删除 13,要么同时删除 10 和 13,但破坏后来的数据,如下所示:
此外,您可以看到同时使用 cout 打印外观和单词1会导致外观由于某种原因不存在。不过,自己打印效果很好。我意识到我可以通过在代码中使用比较函数来检查除最后一个字符之外的所有字符来解决这个问题,但这感觉像是一个临时修复。有什么解决办法吗?
解决方案
我的努力只删除了新行,但没有删除回车
换行符和回车控制被认为是控制字符。
要从字符串中删除所有控制字符,可以使用std::remove_if和std::iscntrl:
#include <cctype>
#include <algorithm>
//...
lookContents.erase(std::remove_if(lookContents.begin(), lookContents.end(),
[&](char ch)
{ return std::iscntrl(static_cast<unsigned char>(ch));}),
lookContents.end());
删除所有控制字符后,您就可以处理字符串而无需检查它们。
推荐阅读
- python - 如何将海龟模块与鼠标一起转动
- java - 如何在不使用 Long 或 Double 的情况下强制 Java 打印出大数?
- c++ - 使用梯度下降求解非线性系统
- html - 如何制作一个通过选项递增的按钮?
- python - 在一个标题下按列附加到 csv 文件
- c - 没有指针的奇怪输出
- python - 回答问题后代码重复为什么?
- angular - 如何在 HttpGet 中将对象数组从 Angular 发送到 Web API Core?
- python - 如何让 Python Chatbot 调用特定功能?
- amazon-web-services - EC2 在 CloudFront 后面使用 HTTPS 运行 NGINX?