设计一个位字段结构用来存储以下信息:
Font ID:0到255之间的一个数
Font Size:0到127之间的一个数
Bold: Off (0)或on (1)
Italic: Off (0)或on (l)
Underline: Off (0)或on (1)
在程序中使用这个结构来显示字体参数,并使用循环的菜单来让用户改变参数。例如,程序的一个运行示例如下:
ID SIZE ALIGNMENT B I U
1 12 left off off off
f)change font s)change size a)change alignment
b)toggle bold i)toggle italic u)toggle underline
q)quit
s
Enter font size (0-127): 36
ID SIZE ALIGNMENT B I U
1 36 left off off off
f)change font s)change size a)change alignment
b)toggle bold i)toggle italic u)toggle underline
q)quit
a
Select alignment:
l)left c)center r)right
r
ID SIZE ALIGNMENT B I U
1 36 right off off off
f)change font s)change size a)change alignment
b)toggle bold i)toggle italic u)toggle underline
q)quit
i
ID SIZE ALIGNMENT B I U
1 36 right off on off
f)change font s)change size a)change alignment
b)toggle bold i)toggle italic u)toggle underline
q)quit
q
Bye!
达个程序应该使用&操作符和合适的掩码来保证Font ID和Font size信息被转换到指定的范围内。

#include <stdio.h> struct { unsigned int id : 8 ; unsigned int size : 7 ; unsigned int alignment : 2 ; unsigned int bold : 1 ; unsigned int italic : 1 ; unsigned int underline : 1 ; }font; char align[3][7]={"left", "center", "right"}; char on_off[2][4]={"off", "on"}; int main(void) { int n; char command[5]; while(1) { printf("%-14s%-14s%-14s%-14s%-14s%-14s\n", "ID", "SIZE", "ALIGNMENT", "B", "I", "U"); printf("%-14d%-14d%-14s%-14s%-14s%-14s\n", font.id, font.size, align[font.alignment], on_off[font.bold], on_off[font.italic], on_off[font.underline] ); printf("f)change font s)change size a)change alignment\n"); printf("b)toggle bold i)toggle italic u)toggle underline\n"); printf("q)quit\n"); gets(command); switch(command[0]) { case 'f' : printf("Enter font ID (0-255): "); scanf("%d", &n); getchar(); font.id = n; break; case 's' : printf("Enter font size (0-127): "); scanf("%d", &n); getchar(); font.size = n; break; case 'a' : printf("Select alignment:\nl)left c)center r)right\n"); gets(command); switch(command[0]) { case 'l' : font.alignment = 0; break; case 'c' : font.alignment = 1; break; case 'r' : font.alignment = 2; break; default : puts("error!"); break; } break; case 'b': font.bold = !font.bold; break; case 'i': font.italic = !font.italic; break; case 'u': font.underline = !font.underline; break; default : puts(command); return 0; } } }