我想摆脱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
答案 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 ++工具箱中。