Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中asctime()产生的字符串缓冲区溢出_C_Buffer_Overflow_Buffer Overflow - Fatal编程技术网

C中asctime()产生的字符串缓冲区溢出

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);

我想用C语言用
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()的内容,它实际上在最后生成了一个新的换行符。我只需要修剪绳子的末端:)