2016-12-20 82 views
-2

我有这个代码,我需要在不更改字符大小的情况下打印出值。打印出日期(作为字符声明)作为字符串

#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 

我想一个月,以保持数据截至2个字节,为2个字节,因此\ 0这里行不通

+0

什么是背后%.2s \ n中的逻辑 –

回答

0

赋值操作只是未能在birthMonth,birthDay和birthYear的末尾放置NULL字符,因为大小是什么你正试图分配(即“07”,“12”或“1990”)与阵列的大小相同(即birthDay,birthMonth,birthYear)。使其相应的数组大小至少增加1个字节以使它们能够包含以NULL结尾的字符串。

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

由于大小为您要分配什么尺寸完全相同,它未能将NULL,这导致在打印垃圾字符结束。

或者

您可以通过指定你想要多少个字符打印像下面

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

查找到this阅读更多关于宽度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);