首页 > 解决方案 > 如何从 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会导致外观由于某种原因不存在。不过,自己打印效果很好。我意识到我可以通过在代码中使用比较函数来检查除最后​​一个字符之外的所有字符来解决这个问题,但这感觉像是一个临时修复。有什么解决办法吗?

标签: c++stringascii

解决方案


我的努力只删除了新行,但没有删除回车

换行符和回车控制被认为是控制字符。

要从字符串中删除所有控制字符,可以使用std::remove_ifstd::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());

删除所有控制字符后,您就可以处理字符串而无需检查它们。


推荐阅读