【问题标题】:Removing EOL from a C++ string but preserving the '\0'从 C++ 字符串中删除 EOL 但保留 '\0'
【发布时间】:2016-02-18 18:05:34
【问题描述】:

这可能是一个愚蠢的问题,但如果我有如下 C++ 字符串,

str = "the cat is black\n"

如果我删除最后一个字符,即“\n”,这是否会留下一个以空字符结尾的字符串?下面的语句是否适用于从原始字符串 str 创建一个以 null 结尾的 char *?

char *c = str.erase(str.size()-1).c_str();

【问题讨论】:

  • 您可以通过将'\0' 移到那里来删除最后一个字符,因为'\0' 会终止字符串。
  • @Rhymoid:这有点简化......字符串通常还会有一个更新的长度字段,如果你在字符串中间可以有一个\0想要。
  • 对于 C '\n' 删除,请参阅 stackoverflow.com/q/2693776/2410359
  • 建议从“c++ c string”标签中删除C。
  • std::string::erase 使字符串内部全部正确排序(所有成员函数等也是如此),因此 .c_str() 的行为与任何 std::string 对象一样(即空终止)。跨度>

标签: c++ string


【解决方案1】:

是的,std::string::c_str() 将始终返回一个以 null 结尾的字符串。

http://www.cplusplus.com/reference/string/string/c_str/

http://en.cppreference.com/w/cpp/string/basic_string/c_str

【讨论】:

  • 谢谢!!我的理解是,只要它是 c.str(),那么 '\0' 终止是自动的,
【解决方案2】:

如果是C字符串例如

char str[] = "the cat is black\n";

你可以这样做

str[strcspn( str, "\n" )] = '\0';

如果是std::string类型的对象,例如

std::string str( "the cat is black\n" );

你可以写

if ( str.back() == '\n' ) str.erase( str.size() - 1 );

if ( !str.empty() && str.back() == '\n' ) str.erase( str.size() - 1 );

此声明

const char *c = str.erase( str.size() - 1 ).c_str();
^^^^^

如果字符串包含换行符或为空,也有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2010-12-31
    • 2013-03-07
    相关资源
    最近更新 更多