C语言中的日期格式

C语言中的日期格式,c,C,我正在尝试将以dd/mm/yyyy格式输入的日期更改为年月日格式,我已经完成了大部分操作,但我的输出在日期后添加了一个额外的奇怪字符。这是我的密码 #include <stdio.h> #include <string.h> void main() { char userDate[11]; char dateWord[11]; char day[2]; char year[4]; printf("Welcome to the Dat

我正在尝试将以dd/mm/yyyy格式输入的日期更改为年月日格式,我已经完成了大部分操作,但我的输出在日期后添加了一个额外的奇怪字符。这是我的密码

#include <stdio.h>
#include <string.h>
void main()
{
    char userDate[11];
    char dateWord[11];
    char day[2];
    char year[4];
    printf("Welcome to the Date Formatter.\nPlease input a date in the form of mm/dd/yyyy.\n");
    scanf("%s", userDate);

    day[0] = userDate[3];
    day[1] = userDate[4];
    year[0] = userDate[6];
    year[1] = userDate[7];
    year[2] = userDate[8];
    year[3] = userDate[9];

    if (userDate[0] == '0' && userDate[1] == '1')
        strcpy(dateWord, "January");
    if (userDate[0] == '0' && userDate[1] == '2')
        strcpy(dateWord, "February");
    if (userDate[0] == '0' && userDate[1] == '3')
        strcpy(dateWord, "March");
    if (userDate[0] == '0' && userDate[1] == '4')
        strcpy(dateWord, "April");
    if (userDate[0] == '0' && userDate[1] == '5')
        strcpy(dateWord, "May");
    if (userDate[0] == '0' && userDate[1] == '6')
        strcpy(dateWord, "June");
    if (userDate[0] == '0' && userDate[1] == '7')
        strcpy(dateWord, "July");
    if (userDate[0] == '0' && userDate[1] == '8')
        strcpy(dateWord, "August");
    if (userDate[0] == '0' && userDate[1] == '9')
        strcpy(dateWord, "September");
    if (userDate[0] == '1' && userDate[1] == '0')
        strcpy(dateWord, "October");
    if (userDate[0] == '1' && userDate[1] == '1')
        strcpy(dateWord, "November");
    if (userDate[0] == '1' && userDate[1] == '2')
        strcpy(dateWord, "December");


    printf("The date is:\n");
    printf("%s %s, %s\n", dateWord, day, year);
}

我不知道为什么会这样╢ 正在打印。

已经有用于日期解析和格式化的函数,
strtime
strftime
。所以你可以使用它们。首先,使用
strtime
将日期解析为
struct tm

#include <time.h>

struct tm date;
strptime( userDate, "%m/%d/%Y", &date );
使用strftime的好处之一是它将尊重用户的区域设置,并以适当的语言提供月份。默认情况下,C不支持locale,您必须调用
setlocale(LC\u ALL,”)


请注意,您的
scanf
应限制为userDate缓冲区的大小,否则可能会溢出缓冲区<代码>%s
应始终有一个限制

scanf("%10s", userDate);

虽然有些编译器会接受
voidmain
,但它是非标准的。它应该始终是
int main

已经有了日期解析和格式化功能,
strtime
strftime
。所以你可以使用它们。首先,使用
strtime
将日期解析为
struct tm

#include <time.h>

struct tm date;
strptime( userDate, "%m/%d/%Y", &date );
使用strftime的好处之一是它将尊重用户的区域设置,并以适当的语言提供月份。默认情况下,C不支持locale,您必须调用
setlocale(LC\u ALL,”)


请注意,您的
scanf
应限制为userDate缓冲区的大小,否则可能会溢出缓冲区<代码>%s
应始终有一个限制

scanf("%10s", userDate);

虽然有些编译器会接受
voidmain
,但它是非标准的。它应该始终是
int main

char day[2]->
字符日[3]然后
第[2]天='\0'
。否则,您在
day
中没有有效字符串。这一年也有同样的问题。哇,我觉得这个问题很愚蠢。。非常感谢你!习惯这种感觉——这不会是最后一次了。
:)
注意,你没有留下任何错误的余地。如果用户在某处键入空格,您将得到虚假输入。一般来说,最好给用户留下创造性的空间,并检查他们是否有创造性。(因此,
char-userDate[11];
scanf(“%s”,userDate);
而不是
scanf(“%10s”,userDate);
在玩火-你会被烧死。你不检查你是否得到任何输入-你应该。
char-day[2];
->
char-day[3];
然后是
day[2]='\0'
。否则您在
中没有有效的字符串。
也有同样的问题。哇,我觉得这个问题很愚蠢。非常感谢您!习惯这种感觉--这不会是最后一次
:)
请注意,您没有留下任何错误余地。如果用户在某处键入空格,您将得到虚假输入。一般来说,最好给用户留下创造性的空间,并检查他们是否有创造性。(因此,
char userDate[11];
scanf(“%s”,userDate);
而不是
scanf(“%10s”,userDate);
在玩火-你会被烧死。你不检查你是否得到任何输入-你应该这样做。
scanf("%10s", userDate);