题目描述:
解题思路
1.将字符串给以" "为间隔进行切割然后各个部分进行不同的处理。
字符串切割使用 strtok(char* a, char* b) 函数,该函数返回切割完成后第一个子串的指针。
//切割,返回第一个字串的指针。这里注意,第二个参数也必须是字符串,写’ ‘是错误的。
char* ptr = strtok(char* date, " ");
//获得下一个字串的方法。
ptr = strtok(NULL, " ");
2.字符串比较使用 strcmp(char* a, char* b) 函数,若两字符串相同则返回0,否则返回第一个不同字符的索引。
3.字符串拼接使用 strcat(char* a, char* b) 函数,该函数会从a字符串的’\0’处开始(包括这个’\0’字符)赋值b字符串(包括b字符串最后的’\0’字符)。因此a要有足够的空间容纳b字符串的长度。
char * reformatDate(char * date){
char* ptr = strtok(date," ");
//日
char* day = (char*)malloc(sizeof(char)*3);
if(ptr[1] == 's' || ptr[1] == 'n' || ptr[1] == 'r' || ptr[1] == 't'){
day[0] = '0';
day[1] = ptr[0];
day[2] = '\0';
}else{
day[0] = ptr[0];
day[1] = ptr[1];
day[2] = '\0';
}
//月
ptr = strtok(NULL," ");
char* month;
if(!strcmp("Jan",ptr)){
month = "01";
}else if(!strcmp("Feb",ptr)){
month = "02";
}else if(!strcmp("Mar",ptr)){
month = "03";
}else if(!strcmp("Apr",ptr)){
month = "04";
}else if(!strcmp("May",ptr)){
month = "05";
}else if(!strcmp("Jun",ptr)){
month = "06";
}else if(!strcmp("Jul",ptr)){
month = "07";
}else if(!strcmp("Aug",ptr)){
month = "08";
}else if(!strcmp("Sep",ptr)){
month = "09";
}else if(!strcmp("Oct",ptr)){
month = "10";
}else if(!strcmp("Nov",ptr)){
month = "11";
}else{
month = "12";
}
//年
ptr = strtok(NULL," ");
char * result = (char*)malloc(sizeof(char)*11);
for(int i = 0; i < 11; i++){
result[i] = '\0';
}
strcat(result, ptr);
result[4] = '-';
strcat(result, month);
result[7] = '-';
strcat(result, day);
return result;
}
#define MAX_LEN 11
#define MONTH 12
char month[MONTH][4] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};//设置字典
char *reformatDate(char *date)
{
char day[5] = { 0 };
char year[5] = { 0 };
char month_temp[4] = { 0 };
int imonth;
char *ans = (char*)malloc(sizeof(char) * MAX_LEN);
//最终的答案
sscanf(date, "%[0-9]%*[a-z] %s %s", day, month_temp, year);
//sscanf和sprintf两个函数十分重要,需要记一下
//这样就可以不用分割函数,直接写进去
for (int i = 0; i < MONTH; i++) {
if (strcmp(month_temp, &month[i]) == 0) {
//要是月份没有匹配上,就加一,这样就可以得到数字
imonth = i + 1;
}
}
sprintf(ans, "%s-%02d-%02d", year, imonth, atoi(day));
//sprintf的用法也要记住
return ans;
}