将日期(声明为字符)打印为字符串

时间:2016-12-20 18:53:38

标签: c string struct char

我有这个代码,我需要打印出值而不改变字符大小。

#include <stdio.h>
#include <string.h>
typedef struct studentData
{
int ID;
char lastName[10];
char firstName[10];
char birthMonth[2];
char birthDay[2];
char birthYear[4];
}
studentData;

int main()
{
 studentData admin={12345,"John","Doe","07","12","1990"};


printf("ID: %d\n",admin.ID);
printf("Last Name: %s\n",admin.lastName);
printf("First Name: %s\n",admin.firstName);
printf("Birth Month: %s\n",admin.birthMonth);
printf("Birth Day: %s\n",admin.birthDay);
printf("Birth Year: %s\n",admin.birthYear);

return 0;
}

我的结果

ID: 12345
Last Name: John
First Name: Doe
Birth Month: 07121990
Birth Day: 121990
Birth Year: 1990

我想要什么

ID: 12345
Last Name: John
First Name: Doe
Birth Month: 07
Birth Day: 12
Birth Year: 1990

我想将Date保存为2个字节,将月份保存为2个字节,以便\ 0在这里工作

3 个答案:

答案 0 :(得分:1)

使用带有"%s"精度说明符不能打印超过数组大小的值。这样admin.birthMonth 需要空字符终止。然而,如果代码后来使用字符串,使用wider array是明智的,只有一点点内存昂贵。

  

s次转换要写入的最大字节数。 C11dr§7.21.6.14

printf("Birth Month: %.2s\n",admin.birthMonth);
// or
printf("Birth Month: %.*s\n", (int) (sizeof admin.birthMonth), admin.birthMonth);

答案 1 :(得分:0)

赋值操作无法在出生月份,出生日和出生年份中放置一个NULL字符,因为您要分配的大小(即“07”,“12”或“1990”)与大小相同阵列(即birthDay,birthMonth,birthYear)。使其相应的数组大小至少为1byte,以使它们能够包含以NULL结尾的字符串。

typedef struct studentData
{
    int ID;
    char lastName[10];
    char firstName[10];
    char birthMonth[3];
    char birthDay[3];
    char birthYear[5];
}
studentData;

由于大小与您要分配的大小完全相同,因此无法在最后输入NULL,从而导致打印垃圾字符。

您可以使用Precision Specifier打印,即指定要打印的字符数,如下所示

printf("Birth Month: %.2s\n", admin.birthMonth);
printf("Birth Day: %.2s\n", admin.birthDay);
printf("Birth Year: %.4s\n", admin.birthYear);

查看this以了解有关宽度和宽度的更多信息精确说明。

答案 2 :(得分:0)



typedef struct studentData
{

    int ID;
    char lastName[10];
    char firstName[10];
    char birthMonth[3];
    char birthDay[3];
    char birthYear[5];

}

studentData;

int main()
{

    studentData admin={12345,"John","Doe","07","12","1990"};
    printf("ID: %d\n",admin.ID);
    printf("Last Name: %s\n",admin.lastName);
    printf("First Name: %s\n",admin.firstName);
    printf("Birth Month: %s\n",admin.birthMonth);
    printf("Birth Day: %s\n",admin.birthDay);
    printf("Birth Year: %s\n",admin.birthYear);
    return 0;

}

生日,生日和出生年份的大小应分别为3、3和5,以使最后一个空格占据零位字符。在您的代码中,大小等于no。想要的角色。 谢谢