C++中如何将Chrono的毫秒值存入变量并正确拼接至字符串
解决Chrono毫秒值转变量及字符串拼接问题
嘿,我来帮你搞定这个Chrono计时和字符串拼接的问题!你遇到的两个错误其实都是因为没正确处理std::chrono::milliseconds的数值类型,以及误用了C风格字符串的拼接函数,我来一步步给你讲清楚怎么改:
先说说你出错的原因
- 第一个错误:
std::chrono::milliseconds是一个时长类型,不是单个字符,你不能直接把它赋值给char变量。要获取它代表的毫秒数,必须调用.count()方法,这个方法会返回对应的整数值(类型是long long,因为chrono默认用64位整数存储时长)。 - 第二个错误:
strcat函数要求第二个参数是C风格字符串(const char*),但你传了一个char类型的变量,类型完全不匹配,自然会报错。
方法1:延续你的C风格char数组写法(安全版)
如果想继续用char数组,推荐用snprintf来格式化字符串,它比strcat+手动转换更安全,能避免缓冲区溢出:
#include <chrono> #include <cstring> #include <cstdio> using namespace std::chrono; int main() { system_clock::time_point StartTime = system_clock::now(); // 这里放你要计时的代码逻辑 system_clock::time_point FirstPartEndTime = system_clock::now(); // 计算耗时并提取毫秒数值 milliseconds mill = duration_cast<milliseconds>(FirstPartEndTime - StartTime); long long ms_value = mill.count(); // 拿到真正的毫秒数 char test[70] = "The required time is as follows :"; // 把毫秒数追加到字符串末尾,注意留足缓冲区空间 snprintf(test + strlen(test), sizeof(test) - strlen(test), " %lld ms", ms_value); // 测试输出 puts(test); return 0; }
方法2:用C++风格的std::string(更推荐)
如果用C++的标准字符串,操作会更简单,完全不用操心缓冲区大小的问题,代码可读性也更高:
#include <chrono> #include <string> #include <iostream> using namespace std::chrono; int main() { system_clock::time_point StartTime = system_clock::now(); // 你的计时代码 system_clock::time_point FirstPartEndTime = system_clock::now(); milliseconds mill = duration_cast<milliseconds>(FirstPartEndTime - StartTime); long long ms_value = mill.count(); // 直接用std::to_string转换数值并拼接 std::string test = "The required time is as follows : " + std::to_string(ms_value) + " ms"; // 如果需要更复杂的格式化(比如小数、特殊格式),可以用stringstream // std::stringstream ss; // ss << "The required time is as follows : " << ms_value << " ms"; // std::string test = ss.str(); std::cout << test << std::endl; return 0; }
总结一下:核心就是用.count()从std::chrono::milliseconds里提取真正的毫秒数值,然后根据你的代码风格选择C或C的字符串拼接方式。如果是新项目,优先用C的std::string或stringstream,能减少很多内存安全问题。
内容的提问来源于stack exchange,提问作者Gaon
相关产品推荐
相关产品推荐

