2016-12-20 81 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);