如何从 C++ 中的字符串中删除换行符?
How can I remove a newline from inside a string in C++?
我正在尝试从用户那里获取文本输入并将其与文本文件中的值列表进行比较。值是这样的:
最后那条线是光标,不是直线,不过没关系。无论如何,我按单词排序并生成值,然后检查值。分号是单词之间的分隔符。所有数据都是让代码首先运行的基础。重要的是所有数据块后面都有换行符。无论我尝试什么,我都无法完全摆脱换行符。查看 ASCII 值说明了原因,我的努力只删除了新行,而不是回车 return。这在大多数情况下都很好,但是在比较值时它们不会相同,因为带有回车 return 的值被视为更长。以下是代码的重要部分:
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 是回车符 return,10 是换行符。最后一个在代码的前面有 10 个删除,因此代码不会对空子字符串执行额外的循环。我努力删除换行符,包括注释掉的擦除功能,要么只删除 13,要么同时删除 10 和 13 但会损坏以后的数据,如下所示:
此外,您可以看到同时使用 cout 打印 look 和 words1 会导致 look 由于某种原因不存在。不过,单独打印它效果很好。我意识到我可以通过在代码中使用比较函数来检查除了最后一个字符之外的所有字符来解决这个问题,但这感觉像是一个临时修复。有什么解决办法吗?
My efforts remove only the new line, but not the carriage return
换行符和回车符被认为是控制字符。
要从字符串中删除所有控制字符,您可以使用std::remove_if along with 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());
一旦删除了所有控制字符,就可以处理字符串而无需检查它们。
我正在尝试从用户那里获取文本输入并将其与文本文件中的值列表进行比较。值是这样的:
最后那条线是光标,不是直线,不过没关系。无论如何,我按单词排序并生成值,然后检查值。分号是单词之间的分隔符。所有数据都是让代码首先运行的基础。重要的是所有数据块后面都有换行符。无论我尝试什么,我都无法完全摆脱换行符。查看 ASCII 值说明了原因,我的努力只删除了新行,而不是回车 return。这在大多数情况下都很好,但是在比较值时它们不会相同,因为带有回车 return 的值被视为更长。以下是代码的重要部分:
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 是回车符 return,10 是换行符。最后一个在代码的前面有 10 个删除,因此代码不会对空子字符串执行额外的循环。我努力删除换行符,包括注释掉的擦除功能,要么只删除 13,要么同时删除 10 和 13 但会损坏以后的数据,如下所示:
此外,您可以看到同时使用 cout 打印 look 和 words1 会导致 look 由于某种原因不存在。不过,单独打印它效果很好。我意识到我可以通过在代码中使用比较函数来检查除了最后一个字符之外的所有字符来解决这个问题,但这感觉像是一个临时修复。有什么解决办法吗?
My efforts remove only the new line, but not the carriage return
换行符和回车符被认为是控制字符。
要从字符串中删除所有控制字符,您可以使用std::remove_if along with 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());
一旦删除了所有控制字符,就可以处理字符串而无需检查它们。