1樓:度伊人網路董事長
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h"
從鍵盤獲得漢字的編碼
在中文windows下,預設編碼方式為gb2312, 每個漢字由兩個位元組組成。
函式的目的是:把這個漢字的高位元組寫入 pc1指向的位置,低位元組寫入 pc2指向的位置
int get_han_zi(unsigned char* pc1, unsigned char* pc2)
char buf[100];
printf("\n請輸入一個漢字:");
gets(buf);
if(strlen(buf) != 2) return -1;
*pc1 = buf[0];
*pc2 = buf[1];
if(*pc1 < 0xa1) return -2;
if(*pc2 < 0xa1) return -2;
return 0;}
從檔案(字形檔案hzk16)把字形裝入到一個32位元組的緩衝區 buf 中。
c1 是該漢字gb2312編碼的高位元組,c2是低位元組。
每個bit代表1個畫素點,16點陣的字模需要256個畫素點資訊,故需32位元組
位元組的排列與16點陣畫素的對應關係如下圖:
第0位元組 第1位元組
第2位元組 第3位元組
第14位元組 第15位元組
也就是說:每1行的16個點由2個位元組提供。順序是:從上到下,從左到右。
gb2312的編碼規則是:前一個位元組表示區號,後一個表示區中的偏移序號。
每個區有94個漢字。區號和序號的編碼都是從 0xa1開始(為了避免和西文衝突)
因此,已知某個漢字的編碼,就可以計算出檔案中所在的絕對位置。
void load_han_zi(unsigned char* buf, unsigned char c1, unsigned char c2)
int n = (c1 - 0xa1) * 94 + (c2 - 0xa1); // 計算在檔案中的位置
file* fp = fopen("hzk16.dat", "rb");
if(fp==null)
顯示漢字
buf: 從檔案中讀出的漢字字模資訊,32位元組,說明同上
italic: =1,如果要求斜體, =0 正常
kx: 水平放大率
ky: 垂直放大率
fill: 用於填充的字元
void show_han_zi(unsigned char* buf, int italic, int kx, int ky, char fill)
for(int i=0; i<16; i++)
int set_zoom_k(int* pk)
printf("請輸入放大率(1-4):");
char buf[100];
gets(buf);
int n = atoi(buf);
if(n<1 || n>4) return -1;
*pk = n;
return 0;
char get_fill_char()
for(;;){
printf("請輸入用於填充的字元");
char c = getch();
if(c>32 && c<125) return c;
int main(int argc, char* argv)
unsigned char han_zi_buf[32]; // 儲存16點陣漢字的字模
int font_italic = 0;
int font_kx = 1; // 水平放大率
int font_ky = 1; // 垂直放大率
char fill_char = '@'; // 填充字元
for(;;){
printf("\n----------------\n");
printf("1. 輸入一個漢字\n");
printf("2. 切換斜體\n");
printf("3. 設定水平放大\n");
printf("4. 設定垂直放大\n");
printf("5. 設定填充字元\n");
printf("6. 輸出到檔案a.txt\n");
printf("7. 退出\n");
printf("----------------\n");
printf("請選擇相應的數字\n"); char c = (char)getch();
switch(c){
case '1':
unsigned char c1;
unsigned char c2;
if(get_han_zi(&c1, &c2) != 0)
printf("\n輸入無效!\n");
else{
load_han_zi(han_zi_buf, c1, c2);
show_han_zi(han_zi_buf, font_italic, font_kx, font_ky, fill_char);
break;
case '2':
font_italic = (font_italic + 1) % 2;
show_han_zi(han_zi_buf, font_italic, font_kx, font_ky, fill_char);
break;
case '3':
if(set_zoom_k(&font_kx) !=0)
printf("\n輸入無效!\n");
else
show_han_zi(han_zi_buf, font_italic, font_kx, font_ky, fill_char);
break;
case '4':
if(set_zoom_k(&font_ky) !=0)
printf("\n輸入無效!\n");
else
show_han_zi(han_zi_buf, font_italic, font_kx, font_ky, fill_char);
break;
case '5':
fill_char = get_fill_char();
show_han_zi(han_zi_buf, font_italic, font_kx, font_ky, fill_char);
break;
case '6':
write_to_file(han_zi_buf, font_italic, font_kx, font_ky, fill_char);
break;
case '7':
exit(0);
break;
default:
printf("\n您的選擇無效!\n");
return 0;
建立如此檔名hzk16.dat
可以郵箱整套檔案發給你
c語言程式問題,C語言程式問題?
1.在你打算學習c語言之前,你要下一個狠狠地決心.因為許多電腦愛好者在學習c語言的過程中,都會遇到困難,從而沒有堅持到最後.只有你下定狠狠地決心,才能學會c語言,才能學好c語言.2.要想學習好c語言,就要學會細心,耐心.c語言程式的編寫需要非常細心,因為一個標點符號的錯誤,可能導致程式的無法執行.3...
請教一C語言程式,請教一C語言程式
include int main int max 255,min 255,maxi 0,maxj 0,mini 0,minj 0 for int i 0 i 4 i for int j 0 j 3 j if a i j min printf max d d n min d d n maxi,maxj...
c語言程式設計,如何編寫C語言程式
水土第一 我幫你寫,還需要嗎? 先上程式 include include include define max buf len 64 define year len 365 int main void double lowtempercity1 year len double hightemperc...