【发布时间】:2017-05-29 07:51:04
【问题描述】:
我正在制作一个 C 程序,将 12 小时制时钟转换为 24 小时制时钟,输入格式为 HH:MM:SSAM 或 HH:MM:SSPM,24 小时制时钟输出为 HH:MM:SS
#include <stdio.h>
#include <stdlib.h>
int main(){
char *time = malloc(11 * sizeof(char));
scanf("%11s", time);
if (time[8] == 'A' || time[8] == 'P')
{
if (time[8] == 'A')
{
time = realloc(time, (9 * sizeof(char)));
printf("%s\n", time);
}
else
{
time = realloc(time, (8 * sizeof(char)));
char str[3];
sprintf(str, "%c%c", time[0], time[1]);
int hours;
hours = atoi(str);
int milhours;
milhours = hours + 12;
char milstr[3];
sprintf(milstr, "%d", milhours);
time[0] = milstr[0];
time[1] = milstr[1];
printf("%s\n", time);
}
}
else
{
printf("give a standard format\n");
return 0;
}
return 0;
}
没有编译错误,但是由于缓冲区溢出,程序没有运行。当我减小 dnamic 数组 time 的大小时,是否有必要删除 time 的最后两个元素?
编辑:我为NULL 终止符更新了time、str 和milstr,缓冲区溢出问题得到解决。感谢您的推荐阅读!
【问题讨论】:
-
为什么要在 realloc 之后调用
free(time)? -
为 NUL 终止符分配 +1。
-
sizeof(char)根据定义等于 1。 -
time是常用的标识符,最好自己用。 -
在给出 cmets 和/或问题后就地编辑您的问题不是一个好主意,因为此类编辑可能会使答案/评论难以理解。最好将编辑添加为您的问题的更新/添加。
标签: c dynamic-arrays realloc buffer-overflow