我尝试使用tm
函数将字符串解析为strptime()
结构。
int main(int argc, const char * argv[]) {
char raw_date1[100];
char date1[100];
struct tm *timedata1 = 0;
printf("please provide the first date:");
fgets(raw_date1, sizeof(raw_date1), stdin);
strip_newline(date1, raw_date1, sizeof(raw_date1));
char format1[50] = "%d-%m-%Y";
strptime(date1, format1, timedata1);
在最后一行,程序崩溃并显示以下消息:EXC_BAD_ACCESS (code=1, address=0x20)
。
为什么呢?
一些额外信息:根据调试程序,在崩溃时,date1
为23/23/2323
,format1
为"%d-%m-%Y"
,timedata1
为{ {1}}。
答案 0 :(得分:0)
在您的代码中:
struct tm *timedata1 = 0;
与
相同struct tm *timedata1 = NULL;
因此,陈述
strptime(date1, format1, timedata1);
与
相同strptime(date1, format1, NULL);
即,在您的代码中,您将NULL
作为参数传递给strptime
,这将取消引用指针并产生未定义的行为/错误访问。
所以你应该写下面的内容:
struct tm timedata1 = {0};
strptime(date1, format1, &timedata1);
答案 1 :(得分:0)
您正在将空指针传递给strptime()
作为目标tm
结构。这有未定义的行为。您应该将指针传递给定义为局部变量的tm
结构:
#include <stdio.h>
#include <time.h>
int main(int argc, const char *argv[]) {
char raw_date1[100];
char date1[100];
struct tm timedata1;
printf("please provide the first date:");
if (fgets(raw_date1, sizeof(raw_date1), stdin)) {
strip_newline(date1, raw_date1, sizeof(raw_date1));
char format1[50] = "%d-%m-%Y";
strptime(date1, format1, &timedata1);
...
}
return 0;
}
请注意strptime
不是标准的C函数,尽管它作为POSIX-1.2001的一部分广泛使用。