所以基本上我有一个计算三个整数值的函数:日、月、年
我希望它返回"日/月/年"格式的字符串
这是函数:
char* generateDate(int day, int month, int year){
day++;
int dayCount = 31;
if (month == 4 || month == 6 || month == 9 || month == 11) {
dayCount = 30;
}
else if (month == 2) {
dayCount = 28;
if (year % 4 == 0) {
dayCount = 29;
if (year % 100 == 0) {
dayCount = 28;
if (year % 400 == 0) {
dayCount = 29;
}
}
}
}
if (day > dayCount) {
day = 1;
month++;
if (month > 12) {
month = 1;
year++;
}
}
char* date = malloc(10);
char* s_day;
sprintf(s_day, "%f", day);
date[0] = day;
return date;
}
在函数底部附近,我创建了一个指向 char 数组的指针,并尝试将 day(这是一个 int(转换为字符串并将其添加到数组中,但这还不起作用。我收到以下错误:
RUN FAILED (exit value -1,073,741,819, total time: 1s)
我意识到将 int 转换为字符串并不像我想象的那么容易,尤其是只将其添加到数组中。
我基本上想采取:int day,int month,int year并返回: "日/月/年"(除非必要,否则不需要是指针。它可以通过值传递给调用代码(
抱歉,如果这是一个愚蠢的错误,我已经习惯了 Java 和 C#,在这些地方处理字符串是如此简单
如果您只需要返回带有完整日期的已分配字符串,那么您的任务就非常简单了。你只需要用一个函数来构建字符串,比如sprintf
:
#include <stdio.h>
char* generateDate(int day, int month, int year)
{
/* here you should place parameters check */
char retString = malloc( 11 );
sprintf (retString, "%02d/%02d/%04d", day, month, year);
return retString;
}
请注意,如果相应的整数只有一位数长,则格式%02d
如何打印带有前导 0 的 2 位整数。
我们分配 11 个字符,因为:
- 2 是当天的
- 2 个为当月
- 4 是一年
- 2 用于分隔符
'/'
- 字符串终止符需要 1
当然,可以通过在函数开头插入参数 check 来改进函数,如果它们错误,则返回NULL
。
- 确保
year
低于 9999(为了健全( - 确保
month
介于 1 和 12 之间 - 使用
switch-case
条件,将变量dayMax
设置为每月的最大天数,并检查day
使其介于 1 和dayMax
之间
如果我正确理解了您的代码,看起来您想计算第二天的日期。
无需计算您正在执行的所有操作即可执行此操作的一种方法是使用 C 中的内置运行时函数
struct tm myDate = {0, 0, 0,day,month-1,year - 1900,0,0,-1};
time_t seconds = mktime(&myDate); // strictly speaking it is clock ticks but secs normally
seconds += 3600*24; // add a day of seconds
localtime_s(&myDate, &seconds);
现在你有第二天的年,月和日,没有考虑闰年等。
若要将此字符串返回给调用方,请将缓冲区传递给函数或分配一些内存
char* s_day = malloc( 4 + 1 + 2 + 1 + 2 + 1 ); // 0000/00/00 +
sprintf_s( s_day, "%d/%d/%d", myDate.tm_mday, myDate.tm_mon + 1, myDate.tm_year + 1900);
return s_day;
编辑:如果您希望使用带有前导零的格式,请使用格式字符串
"%02d/%02d/%d" instead