从C++; 在C++程序中,当它读取字符串时,有点类似: "NONAME_1_1\r"

从C++; 在C++程序中,当它读取字符串时,有点类似: "NONAME_1_1\r",c++,C++,\r给我带来了麻烦。我猜它会打印或添加类似“^M”的内容。是这样吗?不管怎样,它给我带来了麻烦,我想摆脱它 我无法修改输入。我想知道,在这一点上,如何使用C++,以最简单的方式,删除这个字符串的 \r>代码>。p> 我知道如何在BASH上做这件事,但没有关于C++的线索。 谢谢。这取决于您如何将其保存在内存中: 如果它在std::string中,只需检查最后一个字节,如果它是'\r',则将其删除 如果它位于常量char*中,则可以使用strncpy将字符串复制到另一个char数组中,有条件地获取

\r
给我带来了麻烦。我猜它会打印或添加类似“^M”的内容。是这样吗?不管怎样,它给我带来了麻烦,我想摆脱它

我无法修改输入。我想知道,在这一点上,如何使用C++,以最简单的方式,删除这个字符串的<代码> \r>代码>。p> 我知道如何在BASH上做这件事,但没有关于C++的线索。
谢谢。

这取决于您如何将其保存在内存中:

  • 如果它在std::string中,只需检查最后一个字节,如果它是
    '\r'
    ,则将其删除
  • 如果它位于常量char*中,则可以使用strncpy将字符串复制到另一个char数组中,有条件地获取最后一个字节
  • 如果“I can not modify the input”(我不能修改输入),您的意思只是不能触摸源文件,那么您可以选择将其读入字符数组,并用
    '\r'
    替换任何尾随的
    '\0'

  • 我假设字符串是指
    std::string

    如果只需要删除字符串的最后一个字符,则可以执行以下操作:

    <>编辑:<代码> POPYBACK()/Cyp>是C++的下一个版本,抱歉。 通过一些检查:

    if (!mystring.empty() && mystring[mystring.size() - 1] == '\r')
        mystring.erase(mystring.size() - 1);
    
    如果要删除所有
    \r
    ,可以使用:

    mystring.erase( std::remove(mystring.begin(), mystring.end(), '\r'), mystring.end() );
    

    在unix和windows之间移动文件行后,从文件中读取这些行时,这是一个常见问题

    • Unix变体使用“\n”(换行符)终止行
    • Windows使用“\r\n”(回车,换行)终止行

    您可以运行“dos2unix”或“unix2dos”来转换文件中的行。

    copy\u如果您希望保留原始字符串不变,并且希望删除多个字符(如本例中的CR&LF),则此功能非常有用

    const std::string input = "Hello\r\nWorld\r\n";
    std::string output;
    output.reserve(input.length());
    
    std::copy_if(input.begin(), input.end(),
               std::back_inserter(output),
               [] (char c) { return c != '\r' && c != '\n'; });
    

    你怎么读这个字符串?你在用iostreams吗?请发布相关代码。如果您是用C编程,这听起来像是strtok的典型用法。最后一个问题是,在比较字符串和字符时,我认为“\r”将需要两个字符,但不是,它只是一个字符。我将如何使用条件语句?如果char[4]==`\r'???我明白了。那么它是否像检测\r\n那样简单?你能告诉我你会怎么做吗?谢谢lot@Werner,我不知道您是如何表示输入的。您问题中的一些示例代码可能会有所帮助。然后使用Charles Bailey的解决方案。最后一个问题是,在比较字符串和字符时,我认为“\r”会占用两个字符,但不是,它只是一个字符。我将如何使用条件语句?if char[4]==`\r'??@Werner:反斜杠引入和转义序列
    \r
    是回车符、ASCII码十进制13/十六进制0D、
    ^M
    等。在单引号中,它是一个单字符常量;在双引号中,它将是一个由两个字符组成的字符串文字:ASCII 13和一个终止的null。谢谢你的这篇文章。我知道必须有一种简单的方法来清除旧mac和windows文件编码中的文件行。因此,现在我首先运行getline(File,line),不使用第三个参数来删除\n(如果存在),然后使用您的示例来清除任何\r。它似乎起作用了。谢谢如果没有这个,垃圾就会留在每个循环的令牌向量的最后一个索引中。我肯定是编码错误\r\n
    mystring.erase( std::remove(mystring.begin(), mystring.end(), '\r'), mystring.end() );
    
    const std::string input = "Hello\r\nWorld\r\n";
    std::string output;
    output.reserve(input.length());
    
    std::copy_if(input.begin(), input.end(),
               std::back_inserter(output),
               [] (char c) { return c != '\r' && c != '\n'; });