不定長字串輸入處理小技巧

2021-05-17 10:30:08 字數 1206 閱讀 9631

大家在程式設計的過程中,經常會遇到需要輸入乙個不定長字串的情況。通常來說,解決這個問題可以有兩種方法:

一是先分配乙個固定長度的緩衝區,把輸入的字串先儲存到這個緩衝區,然後再根據其長度動態分配記憶體。這個方法缺點是無論分配多大的緩衝區,都無法完全滿足要求。太大浪費記憶體,太小會發生字串截斷。

二是逐個字元輸入,然後通過realloc函式來實時改變緩衝區的大小。這個方法比第乙個方法稍微好一點。但缺點是動態分配函式使用頻率高,效率太低。

以上兩種方法都有比較明顯的缺點,那麼有沒有更好的方法呢?當然是有的,我們可以在file檔案結構上做做文章。file檔案結構是編譯器相關的,通常不同編譯器有不同的結構成員,但一般來說,都會包含關於緩衝區的資訊,我們可以利用這些資訊來事先獲得輸入字串的字元數量,再根據這個數量分配記憶體。

borland編譯器的file結構含有緩衝區的大小和首位址資訊,bsize成員儲存緩衝區的大小,buffer指標成員儲存緩衝區的首位址。在緩衝區中,輸入回車的時候,通常以0x0a表示,我們可以在緩衝區中通過尋找這個0x0a來計算字元數量,簡化**如下:

char c, *cpbuffer;

int i;

c = getchar();

for(i=0; ibsize; ++i) if(*(stdin->buffer+i) == 0x0a) break; //取得字元數量

cpbuffer = (char*)malloc(i*sizeof(char)+1); //加1是考慮後面加入'/0'

memcpy(cpbuffer, stdin->buffer, i?i:1);

*(cpbuffer+i) = '/0';

計算字元數量的迴圈考慮bsize是因為如果輸入字元數量比緩衝區的size大,那麼不會產生0x0a。預設緩衝區大小是512,如果需要更大的輸入緩衝,可以通過setvbuf函式來改變緩衝的大小。

如果編譯器使用vc,就更方便了,vc的file結構包含了緩衝區的字元數量,成員名叫_cnt,簡化**如下:

char c, *cpbuffer;

int icount;

c = getchar();

icount = stdin->_cnt; //取得字元數量

cpbuffer = (char*)malloc(icount+1);

memcpy(cpbuffer, stdin->buffer, icount?icount:1);

*(cpbuffer+icount) = '/0';

cin輸入不定長的字串

正常情況下,cin遇到空格結束讀取,寫個小例子 int main string a cin a cout 如何讀取帶空格的字串呢,通常由三種方式如下 include using namespace std main char a 20 cin.get a,20 coutmain char m 20 ...

C語言字串不定長引數處理

寫乙個顯示函式 show char str 用於在某些特殊螢幕顯示。但是這個str 是乙個固定的引數,所以要先做 sprintf str,format,然後才能傳給它。這樣比較麻煩,直接寫成 show char str,int len,char format,輸入不定長引數,更加方便。include...

飛秋的不定長度字串處理方法

主要用來處理不定長度字串,飛秋的不定長度字串處理方法 define xstring length 1024 預設快取區的長度 class xstring xstring xstring xstring xstring unsigned int xstring getsize unsigned int...