Хотя вы можете использовать pop_back()
в цикле, в C ++ 11 и более поздних версиях вам осталось проверить последний символ перед удалением, чтобы убедиться, что вы обрезаете конец строки, а не нужный символ.Для автоматизации процесса вы можете использовать функцию-член .c_str()
и функцию strcspn
, предоставляемые строкой <cstring>
и reject
, содержащей оба значения "\r\n"
.Здесь 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 ++.