本文目錄一覽:
C語言里如何設置緩衝區?
將數據以鏈表形式順序存放,新數據總是放在表尾,待處理的數據總是在頭結點下的第一個結點,處理完畢則釋放空間。
#define BufferSize 1024 // 合適的大小你知道的
typedef struct node {
char *buffer;
struct node *next;
}*linkList;
LinkList *InitList() {
LinkList *head;
head = (char *)malloc(size(node));
head-next = NULL:
return head;
}
void AddData(LinkList *head, char *data) { // 將新數據添加到表尾
LinkList *p = head;
LinkList *anode = (char *)malloc(size(node));
anode-buffer = (char *)malloc(size(BufferSize));
strncpy(anode-buffer,data,BufferSize);
anode-next = NULL:
while(p-next) p = p-next;
p-next = anode;
}
void DealData(LinkList *head) {
LinkList *p = head-next;
if(p) {
head-next = p-next;
// p-buffer指向的數據待處理
free(p-buffer); // 處理完畢,釋放空間
free(p);
}
}
C語言里如何設置緩衝區,
將數據以鏈表形式順序存放,新數據總是放在表尾,待處理的數據總是在頭結點下的第一個結點,處理完畢則釋放空間。
緩衝器為暫時置放輸出或輸入資料的內存。緩衝器內資料自儲存設備(如硬碟)來,放置在緩衝器中,須待機送至CPU或其他運算設備。緩衝區(buffer)這個中文譯意源自當計算機的高速部件與低速部件通訊時,必須將高速部件的輸出暫存到某處,以保證高速部件與低速部件相吻合. 後來這個意思被擴展了,成為”臨時存貯區”的意思。
C語言緩衝區在哪裡
緩衝區具體在哪裡是與操作系統、編譯器相關的
以VC++為例。察看getchar的源代碼(src\fgetchar.c),有:
int
__cdecl
_fgetchar
(void){
return(getc(stdin));
}
#undef
getchar
int
__cdecl
getchar
(void){
return
_fgetchar();
}
可見getchar()相當於getc(stdin)
繼續察看getc(src\fgetc.c),有一段(為便於閱讀,有刪減):
int
__cdecl
getc
(FILE
*stream){
int
retval;
_ASSERTE(stream
!=
NULL);
_lock_str(stream);
__try
{
retval
=
_getc_lk(stream);
}
__finally
{
_unlock_str(stream);
}
return(retval);
}
這段代碼里_lock_str其實是通過Win32
API提供的臨街區來鎖住文件
接收用戶輸入發生在_getc_lk,_getc_lk宏調用_filbuf。_filbuf在_filbuf.c中可以查看,這段代碼比較長,就不貼出來了
_filbuf主要是調用了_read(_fileno(stream),
stream-_base,
stream-_bufsiz)
而_read最終則是調用了Win32API
ReadFile,以下是用WinDbg輸出的getchar的調用棧:
#
ChildEBP
RetAddr
00
0012fe6c
0040a4e7
kernel32!ReadFile
01
0012fea8
0040a3b9
TestStruct!_read_lk+0x107
[read.c
@
146]
02
0012fec0
00403140
TestStruct!_read+0x69
[read.c
@
75]
03
0012fee8
00401290
TestStruct!_filbuf+0xd0
[_filbuf.c
@
127]
04
0012ff08
004012cc
TestStruct!fgetc+0x80
[fgetc.c
@
44]
05
0012ff14
0040103d
TestStruct!getc+0xc
[fgetc.c
@
56]
06
0012ff20
00401058
TestStruct!_fgetchar+0xd
[fgetchar.c
@
37]
07
0012ff28
0040101e
TestStruct!getchar+0x8
[fgetchar.c
@
47]
08
0012ff80
0040115c
TestStruct!main+0xe
[d:\my
programs\teststruct\ts.cpp
@
4]
09
0012ffc0
7c816fe7
TestStruct!mainCRTStartup+0xfc
[crt0.c
@
206]
0a
0012fff0
00000000
kernel32!BaseProcessStart+0x23
可見,getchar最終調用了ReadFile。關於ReadFile的原理以及緩衝區在哪裡,請你再提一個問我再回答
C語言 關於緩衝區的條件判斷
首先你要知道對於計算機而言,在取輸入的數據的時候是有個緩衝區的,用於將用戶讀入的素具進行存儲,實際上就是一個隊列;
對你的第一個問題:
int ch1=getchar();
int ch2=getchar();
int ch3=getchar();
在你輸入9回車6回車,那麼此時緩衝區的字元數據為入 9回車6回車(實際上計算機認為你輸入的是字元9和6,因為getchar是針對字元的,由於你定義的是int型,因此計算機會自動轉換為它的ASC碼,也就是一個整數,再你輸出的時候又是以字元串的形式輸出的,計算機又將這個整數(也就是當時的ASC碼)轉換為字元,這兩個轉化不用你管,計算機有這個功能稱為自動轉化),由於getchar是取的單個字元,因此它只取走了前三個字元9 回車 6 最後還有一個回車符停留在緩衝區,那麼在用戶下一次輸入的時候計算機就首先會從回車符開始;
在你輸入9空格6空格3回車,情況和上面一樣,只是緩衝區裡面存放的是 空格 3 回車了,前面的三個都被取走了,那麼在用戶下一次輸入的時候計算機就首先會從空格開始;
對你的第二個問題:
你的想法很美好,但是你忽略了一個事實,
while ((c = getchar()) != ‘\n’)
printf(“%c”, c);
while循環一定會執行一條語句,而且直到遇到第一個語句塊(一般為遇到一個分號,但是if-else除外,因為if-else對計算機而言是一個整體,也就是一個語句塊),也就是說當你輸入 字元c 回車符的時候,緩衝區里存放的是 c 回車符 ,但是此時計算機會逐個檢查你的輸入,首先檢查c 它不是回車符就printf(“%c”, c);將c列印出來,然後發現後面還有字元回車,檢查一下不符合要求就退出循環,不執行下面的printf(“%c”, c)(此時的變數c為回車符),因此組後顯示的就是一個字元c,關於中間的兩次轉換和第一個問題的回答是一樣的;
還有什麼不懂的可以繼續交流~~~
C語言中,求內存緩衝區的詳細解釋!
緩衝區(Buffer)又稱為緩存(Cache),是內存空間的一部分。也就是說,在內存中預留了一定的存儲空間,用來暫時保存輸入或輸出的數據,這部分預留的空間就叫做緩衝區。
緩衝區根據其對應的是輸入設備還是輸出設備,分為輸入緩衝區和輸出緩衝區。
原創文章,作者:GBQC,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/140187.html