从asctime()删除换行符

时间:2019-04-25 23:02:52

标签: c++ newline

我想摆脱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

4 个答案:

答案 0 :(得分:6)

由于换行符是最后一个字符,所以您要做的就是删除字符串中的最后一个字符。您可以致电pop_back

str.pop_back();

在Windows上,换行符为\r\n BUT \n是C和C ++的与平台无关的换行符。这意味着当您在文本模式下将\n写入stdout时,字符将被转换为\r\n。您只需在任何地方使用\n,您的代码将跨平台。

答案 1 :(得分:2)

按照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");

答案 2 :(得分:0)

根据manual asctime()返回char *,所以您可以做的是:

#include <iostream>
#include <cstring>

int main (void) {
    time_t tt;
    struct tm * ti;
    time(&tt);
    ti = localtime(&tt);
    char* c_time = asctime(ti);
    int len = std::strlen(c_time);
    while (c_time[--len] < '0' || c_time[len] > '9')
        c_time[len] = '\0';
    std::string time (c_time);

    std::cout << time;

    return 0;
}

编辑: 对于每个评论,您可以使用以下C样式的解决方案:

#include <iostream>
#include <cstring>

int main (void) {
    time_t tt;
    struct tm * ti;
    time(&tt);
    ti = localtime(&tt);
    char* c_time = asctime(ti);
    int len = std::strlen(c_time);

    time[strcspn (time.c_str(), "\r\n")] = 0;
    std::string time (c_time);

    std::cout << time;

    return 0;
}

或其他适用于Windows的解决方案(如果他们使用\r)将是:

#include <iostream>

int main (void) {
    time_t tt;
    struct tm * ti;
    time(&tt);
    ti = localtime(&tt);
    std::string time (asctime(ti));

    while ((time[time.size() - 1] < '0' || time[time.size() - 1] > '9'))                                 
        time.pop_back();

    std::cout << time;

    return 0;
}

以下是改进的版本,不会删除任何字母或数字:

#include <iostream>

int main (void) {
    time_t tt; 
    struct tm * ti; 
    time(&tt);
    ti = localtime(&tt);
    std::string time (asctime(ti));

    while ( (time[time.size() - 1] < '0' || time[time.size() - 1] > '9') &&
                (time[time.size() - 1] < 'a' || time[time.size() - 1] > 'z') &&
                    (time[time.size() - 1] < 'A' || time[time.size() - 1] > 'Z'))
        time.pop_back();

    std::cout << time;

    return 0;
}

答案 3 :(得分:0)

尽管可以在C ++ 11和更高版本中循环使用pop_back(),但是在删除之前,您需要检查最终字符,以确保修剪的是行尾而不是所需的字符。您可以利用.c_str()和包含两个strcspn的{​​{1}}字符串提供的<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 提供的行尾以添加到C ++工具箱中。