鎵撳紑Source Insight鏉ラ槄璇籈duOS鐨勬簮浠g爜,鎴戜滑鍦╯tdio.c閲屾壘鍒頒簡(jiǎn)printf鐨勫疄鐜頒唬鐮?棣栧厛鐪嬬湅瀵筽rintf鐨勫畾涔?
[code]
int printf (const char *cntrl_string, ...)
[/code]
絎竴涓弬鏁癱ntrl_string鏄帶鍒跺瓧絎︿覆,涔熷氨鏄鉤甯告垜浠啓鍏?d,%f鐨勫湴鏂?绱ф帴鐫鍚庨潰鏄竴涓彉闀垮弬鏁?
鐪嬬湅鍑芥暟澶撮儴鐨勫畾涔?
[code]int pos = 0, cnt_printed_chars = 0, i;
unsigned char* chptr;
va_list ap;[/code]
椹笂鏅?闄や簡(jiǎn)ap鎴戜滑鍙互椹笂鍒ゆ柇鍑烘潵鏄敤鏉ヨ鍙栧彉闀垮弬鏁扮殑,i鐢ㄤ簬寰幆鍙橀噺.鍏朵粬鍙橀噺閮戒笉鐭ラ亾鏄庝箞鍥炰簨.涓嶈鐫鎬?鎴戜滑杈圭湅浠g爜杈瑰垎鏋?浠g爜鐨勭涓琛屽繀鐒舵槸
[code]va_start (ap, cntrl_string);[/code]
鐢ㄦ潵鍒濆鍖栧彉闀垮弬鏁?
鎺ヤ笅鏉ユ槸涓涓獁hile寰幆
[code]while (cntrl_string[pos]) {
...
}[/code]
緇撴潫鏉′歡鏄痗ntrl_string[pos]涓篘ULL,鏄劇劧榪欎釜寰幆鏄敤鏉ラ亶鍘嗘暣涓帶鍒跺瓧絎︿覆鐨?鑷劧pos灝辨槸褰撳墠閬嶅巻鍒扮殑浣嶇疆浜?榪涘叆寰幆棣栧厛闂叆瑙嗙嚎鐨勬槸
[code] if (cntrl_string[pos] == '%') {
pos++;
...
} [/code]
寮闂ㄨ灞?涓婃潵灝卞綋鍓嶅瓧絎︽槸鍚﹀姙鏂槸鍚?.涓鐚滃氨鐭ラ亾濡傛灉鎴愮珛pos++椹笂鍙栧嚭涓嬩竴涓瓧絎﹀湪d,f,l絳夌瓑涔嬮棿榪涜鍒ゆ柇.寰涓嬩竴鐪?鏋滅湡涓嶅嚭鎵鏂?
[code]switch (cntrl_string[pos]) {
case 'c':
...
case 's':
...
case 'i':
...
case 'd':
...
case 'u':
...[/code]
鐢ㄤ笂switch-case浜? 蹇熸祻瑙堜竴涓嬩笅闈㈢殑浠g爜.
棣栧厛鐪嬬湅case 'c'鐨勯儴鍒?/p>
[code]case 'c':
putchar (va_arg (ap, unsigned char));
cnt_printed_chars++;
break;[/code]
%c琛ㄧず浠呬粎杈撳嚭涓涓瓧絎?鍥犳鍏堥氳繃va_arg榪涜鍙傛暟鐨勭被鍨嬭漿鎹?涔嬪悗鐢╬utchar[1]杈撳嚭鍒板睆騫曚笂鍘?涔嬪悗鏄?br>cnt_printed_chars++,閫氳繃榪欏彞鎴戜滑灝卞彲浠ュ垽鏂嚭cnt_printed_chars浣跨敤鏉ヨ〃紺?宸茬粡琚玴rintf杈撳嚭鐨勫瓧絎︿釜鏁扮殑.
鍐嶆潵鐪嬬湅 case 's':
[code] case 's':
chptr = va_arg (ap, unsigned char*);
i = 0;
while (chptr [i]) {
cnt_printed_chars++;
putchar (chptr [i++]);
}
break;[/code]鍜宑ase 'c',鍚屽嚭涓杈?cnt_printed_chars++鏀懼湪浜?jiǎn)弩@鐜唴,涔熻瘉鏄庝簡(jiǎn)鍒氭墠鎻愬埌鐨勪粬鐨勪綔鐢?鍙﹀鎴戜滑涔熺湅鍒頒簡(jiǎn)cnptr鏄敤鏉ュ湪澶勭悊瀛楃涓叉椂鐨勪綅緗寚閽?鍒版涓烘,鎴戜滑娓呮鐨勬墍鏈夊彉閲忕殑鐢ㄩ?鍓嶉斿彉寰楁洿鍔犲厜鏄庝簡(jiǎn).
鎺ヤ笅鏉?
[code]// PartI
case 'i':
case 'd':
cnt_printed_chars += printInt (va_arg (ap, int));
break;
case 'u':
cnt_printed_chars += printUnsignedInt (va_arg (ap, unsigned int));
break;
case 'x':
cnt_printed_chars += printHexa (va_arg (ap, unsigned int), 'x');
break;
case 'X':
cnt_printed_chars += printHexa (va_arg (ap, unsigned int), 'X');
break;
case 'o':
cnt_printed_chars += printOctal (va_arg (ap, unsigned int));
break;
// Part II
case 'p':
putchar ('0');
putchar ('x');
cnt_printed_chars += 2; /* of '0x' */
cnt_printed_chars += printHexa (va_arg (ap, unsigned int), 'x');
break;
case '#':
pos++;
switch (cntrl_string[pos]) {
case 'x':
putchar ('0');
putchar ('x');
cnt_printed_chars += 2; /* of '0x' */
cnt_printed_chars += printHexa (va_arg (ap, unsigned int), 'x');
break;
case 'X':
putchar ('0');
putchar ('X');
cnt_printed_chars += 2; /* of '0X' */
cnt_printed_chars += printHexa (va_arg (ap, unsigned int), 'X');
break;
case 'o':
putchar ('0');
cnt_printed_chars++;
cnt_printed_chars += printOctal (va_arg (ap, unsigned int));
break;[/code]
娉ㄦ剰瑙傚療涓涓?PartII鐨勪唬鐮佸叾瀹炲氨鏄瘮PartI鐨勪唬鐮佸涓涓牱寮?鍦?6榪涘埗鏁版垨鍏繘鍒跺墠鍔犲叆0x鎴栨槸o,絳夌瓑.鍥犳榪欓噷灝卞彧鍒嗘瀽涓涓婸artI鍜?
鍏跺疄浠旂粏鐪嬬湅PartI鐨勪釜鏉ase,涔熷氨鏄妸鍙傛暟鍒嗗彂鍒頒簡(jiǎn)鏇村叿浣撶殑鍑芥暟鐢ㄤ簬鏄劇ず,鐒跺悗浠ヨ繑鍥炲肩殑褰㈠紡榪斿洖杈撳嚭涓暟.瀵逛簬榪欎簺鍑芥暟灝變笉鍏蜂綋鍒嗘瀽浜?鎴戜滑鍏堟潵鐪嬬湅涓浜涘杽鍚庡鐞?
鍏堢湅case鐨刣efault澶勭悊.
[code]default:
putchar ((unsigned char) cntrl_string[pos]);
cnt_printed_chars++;[/code]灝辨槸鐩存帴杈撳嚭cntrl_string閲?鍙峰悗闈㈢殑鏈煡瀛楃.搴旇鏄竴縐嶅閿欒璁″鐞?
鍐嶇湅鐪媔f (cntrl_string[pos] == '%')鐨別lse閮ㄥ垎
[code]else {
putchar ((unsigned char) cntrl_string[pos]);
cnt_printed_chars++;
pos++;
}[/code]
濡傛灉涓嶆槸%寮澶寸殑,閭d箞鐩存帴杈撳嚭榪欎釜瀛楃.
鏈鍚庡嚱鏁拌繑鍥炲墠
[code]va_end (ap);
return cnt_printed_chars;[/code]va_end澶勭悊鍙橀暱鍙傛暟鐨勫杽鍚庡伐浣?騫惰繑鍥炶緭鍑虹殑瀛楃涓暟.
鍦ㄦ渶鍚庢垜浠湁蹇呰璋堣皥putChar鍑芥暟浠ュ強(qiáng)鍩烘湰杈撳嚭鐨勫熀紜鍑芥暟printChar,鍏堟潵鐪嬬湅putChar
[code]int putchar (int c) {
switch ((unsigned char) c) {
case '\n' :
newLine ();
break;
case '\r' :
carriageReturn ();
break;
case '\f' :
clearScreen ();
break;
case '\t' :
printChar (32); printChar (32); /* 32 = space */
printChar (32); printChar (32);
printChar (32); printChar (32);
printChar (32); printChar (32);
break;
case '\b':
backspace ();
break;
case '\a':
beep ();
break;
default :
printChar ((unsigned char) c);
}
return c;
}[/code]
閫?
瑙堜竴涓?涔熸槸switch-case涓轟富浣撶殑.涓昏鏄敤鏉ュ簲瀵逛竴浜涚壒孌婂瓧絎?濡俓n,\r,....榪欓噷闇瑕佹彁涓涓?鍏充簬\t鐨勭悊瑙?鏈変簺浜鴻涓篭t灝辨槸
8涓猻pace,鏈変簺浜哄垯璁や負(fù),灞忓箷鍒嗕負(fù)10澶у垪(姣忎釜澶у垪8涓皬鍒楁誨叡80鍒?.涓涓猏t灝辮煩鍒頒笅涓涓ぇ鍒楄緭鍑?涔熷氨鏄涓嶇浣犵幇鍦ㄥ疄鍦ㄥ睆騫曠殑絎?
1,2,3,4,5,6,7浣嶇疆杈撳嚭瀛楃,鍙涓涓猏t閮藉湪絎?涓綅緗紑濮嬭緭鍑?
VS.NET涓氨鏄敤鐨勮繖縐嶇悊瑙?鍥犳濡傛灉鎸夌収榪欎釜鐞嗚В鐨勮瘽,\t鐨勫疄鐜板彲浠ヨ繖鏍?/p>
[code]int currentX = ((currentX % 10) + 1) * 8;[/code]
鐒跺悗鍦╟urrentX浣嶇疆杈撳嚭.
鎺ヤ笅鏉ョ湅printChar涔熷氨鏄緭鍑洪儴鍒嗘渶浣庡眰鐨勬搷浣滃挴
[code]void printChar (const byte ch) {
*(word *)(VIDEO + y * 160 + x * 2) = ch | (fill_color << 8);
x++;
if (x >= WIDTH)
newLine ();
setVideoCursor (y, x);
}[/code]
榪欓噷VIDEO琛ㄧず鏄懼瓨鍦板潃涔熷氨鏄?xB8000.閫氳繃 y * 160 + x
灞忓箷(x,y)鍧愭爣鍦ㄦ樉瀛樹(shù)腑鐨勪綅緗?榪欓噷闇瑕佺煡閬?涓涓瓧絎︽樉紺洪渶瑕佷袱涓瓧鑺?涓涓槸ASCII鐮?絎簩涓槸瀛楃灞炴т唬鐮佷篃灝辨槸棰滆壊浠g爜.鍥犳鎵嶅繀欏?
y * 80 * 2 + x = y * 160 + x.閭d箞ch | (fill_color <<
8)涔熻嚜鐒跺氨鏄啓鍏ュ瓧絎﹀強(qiáng)灞炴т唬鐮佺敤鐨勪簡(jiǎn).姣忓啓涓涓瓧絎﹀厜鏍囦綅緗姞1,濡傛灉澶т簬灞忓箷瀹藉害WIDTH灝辨崲琛?鏈鍚庨氳繃setVideoCursor璁劇疆鏂扮殑
鍏夋爣浣嶇疆.瀹屾垚浜?jiǎn)鏁翠釜printChar榪囩▼.