如何在 C 中返回格式化字符串?



所以基本上我有一个计算三个整数值的函数:日、月、年

我希望它返回"日/月/年"格式的字符串

这是函数:

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

  1. 确保year低于 9999(为了健全(
  2. 确保month介于 1 和 12 之间
  3. 使用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

最新更新