C中asctime()产生的字符串缓冲区溢出
我想用C语言用C中asctime()产生的字符串缓冲区溢出,c,buffer,overflow,buffer-overflow,C,Buffer,Overflow,Buffer Overflow,我想用C语言用asctime()打印时间,但是当文本打印出来时,随机字符会附加在timeString之后。此外,日志文件中打印出来的文本与shell中打印出来的文本的不同之处在于printf()。在代码下,我提供了两个输出的精确输出。我如何摆脱这种行为?代码在RaspberryPi上运行,我通过默认的macOS终端登录 time_t rawTime; time(&rawTime); struct tm timeInfo = *gmtime(&rawTime);
asctime()
打印时间,但是当文本打印出来时,随机字符会附加在timeString
之后。此外,日志文件中打印出来的文本与shell中打印出来的文本的不同之处在于printf()
。在代码下,我提供了两个输出的精确输出。我如何摆脱这种行为?代码在RaspberryPi上运行,我通过默认的macOS终端登录
time_t rawTime;
time(&rawTime);
struct tm timeInfo = *gmtime(&rawTime);
// ...
char *log;
char *timeString = strdup(asctime(&timeInfo));
asprintf(&log, "UTC: %s %.*s Last status: %s. New status: %s.",
timeString, 5, " ", "Hello", "World");
openlog("httpd-status-notifier", LOG_PID, LOG_USER);
syslog(logLevel, "%s", log);
printf("%s\n", log);
// ...
系统日志:
Dec 22 17:18:17 rasp httpd状态通知程序[25458]:UTC:Sun Dec 22 17:18:17 2019#012最后状态:您好。新状态:世界。
(此处syslog
生成#012
)
外壳(printf):
UTC:Sun Dec 22 17:18:17 2019
最后状态:你好。新状态:世界。
(此处printf
生成一个新行字符)
顺便说一句,是的,我确实注意到
syslog
已经记录了日期。问题是asctime()
产生了一个新行字符,这在日志文件中表示为八进制ASCII值012
,正如@mangusta在注释部分指出的那样。因此,修剪字符串可以解决问题。syslog
使用八进制数来输出控制代码(例如换行符、制表符等)以及空格#012
是换行符的八进制值,通过printf
按原样显示,请发布一条消息,以便我们重现问题并帮助您调试。@mangusta谢谢!我转储了asctime()的内容,它实际上在最后生成了一个新的换行符。我只需要修剪绳子的末端:)