Удалить перевод строки из asctime () - PullRequest
4 голосов
/ 26 апреля 2019

Я хочу избавиться от новой строки, которую asctime() дает мне по прошествии времени

string str;
time_t tt;
struct tm * ti;
time(&tt);
ti = localtime(&tt);
str = asctime(ti);
for (int i = 0; i < 2; i++)
    cout << str;

вывод

fri apr 26 00:59:07 2019
fri apr 26 00:59:07 2019

но я хочу это в этой форме

fri apr 26 00:59:07 2019fri apr 26 00:59:07 2019

Ответы [ 3 ]

6 голосов
/ 26 апреля 2019

Поскольку символ перевода строки является последним символом, все, что вам нужно сделать, это удалить последний символ в строке. Вы можете сделать это, позвонив pop_back

str.pop_back();

В Windows символ новой строки - \r\n НО \n - независимый от платформы символ новой строки для C и C ++. Это означает, что когда вы пишете \n в стандартный вывод в текстовом режиме, символ будет преобразован в \r\n. Вы можете просто использовать \n везде, и ваш код будет кроссплатформенным.

2 голосов
/ 26 апреля 2019

Удаление последних символов строки в соответствии с ответом Kerndog73 будет работать, но так как вы используете C ++, у вас есть лучшее решение: std :: put_time () потоковый манипулятор:

#include <iomanip>
#include <sstream>

// ...

auto tt = time(nullptr);
auto* ti = localtime(&tt);
std::stringstream sstream;
sstream << std::put_time(ti, "%c");
for (int i = 0; i < 2; i++)
    cout << sstream.str();

Если вам не нужно хранить время в виде строки, вы можете просто распечатать его напрямую:

auto tt = time(nullptr);
auto* ti = localtime(&tt);
for (int i = 0; i < 2; i++)
    cout << std::put_time(ti, "%c");
0 голосов
/ 26 апреля 2019

Хотя вы можете использовать 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 ++.

...