虽然您可以在循环中使用pop_back()
,但是在C++11及更高版本中,您需要在删除之前检查最后一个字符以确保您正在修剪行尾而不是所需字符。您可以利用.c_str()
成员函数和<cstring>
提供的strcspn
函数以及包含"\r\n"
的reject
字符串来自动化该过程。在这里,strcspn
返回不包含任何一个字符的字符数。
您可以使用不包括行尾的字符数将其传递给成员函数.erase()
,以从第一个包括的行尾开始删除所有字符,例如:
str.erase (strcspn (str.c_str(), "\r\n"));
您可以将相应数量的字符简单地复制到字符缓冲区中,例如:
char trimmed[64] {}; // sufficiently sized to hold the asctime() return
str.copy (trimmed, strcspn (str.c_str(), "\r\n"));
使用.erase()
,您的第一个示例将如下:
#include <iostream>
#include <cstring>
int main (void) {
time_t tt;
struct tm *ti;
time(&tt);
ti = localtime(&tt);
std::string str (asctime(ti));
str.erase (strcspn (str.c_str(), "\r\n"));
std::cout << "str: '" << str << "'\n\nor your output\n\n";
for (int i = 0; i < 2; i++)
std::cout << str;
std::cout << '\n';
}
使用.copy()
,你可以这样做:
#include <iostream>
#include <cstring>
int main (void) {
time_t tt;
struct tm *ti;
time(&tt);
ti = localtime(&tt);
std::string str (asctime(ti));
char trimmed[64] {};
str.copy (trimmed, strcspn (str.c_str(), "\r\n"));
std::cout << "str: '" << trimmed << "'\n\nor your output\n\n";
for (int i = 0; i < 2; i++)
std::cout << trimmed;
std::cout << '\n';
}
示例使用/输出
两种情况下输出相同,例如:
$ ./bin/asctimetrim
str: 'Thu Apr 25 21:24:43 2019'
or your output
Thu Apr 25 21:24:43 2019Thu Apr 25 21:24:43 2019
这两种方便的附加方式,使用strcspn()
来剪裁行尾,可以添加到您的C++工具箱中。
\r
也会在其中吗? - Nikos C.\n
作为官方的C++
行终止符(在读写文件时将其转换为内部一致性)。 - Galik\n
。在Windows上还可以使用哪些编译器? - user5550963'\n'
,就像在经典Mac上打印'\n'
一样,它会被转换为输出中的'\r'
。 - phuclvstd::endl
是一个返回std::basic_ostream引用的函数,而不是你可以打印的某个数值。即使你想知道换行符,这也行不通,因为在C和C++中,换行符始终是'\n'
,无论系统的换行符是什么(例如经典Mac的'\r'
)。 - phuclv