2007/02/15

C++ 輸入無限長度的字串

通常我們都是把字串存在一個陣列當中,但是我們卻不知到使用者到底會輸入多長的字串,只能宣告成一個非常大的陣列,這樣不但沒有解決問題而且還浪廢掉不少空間。

下面程式碼,是使用動態記憶體配置來即時更改陣列大小,當陣列不夠大時,變會將陣列長度增加 10。
//編譯器:Dev-C++ 4.9.9.2

#include <iostream>
#include <cstdlib>
#include <conio.h>

using namespace std;

int main()
{
char *ch,*tmp;
char in;
int count=10,num=0;
// count紀錄陣列大小 num紀錄用掉的空間
int a;
ch = new char [count];
in = getch();
while( in != '\r' )
{
if( num >= count ) // 檢查陣列是否過小
{
tmp = new char [count+10]; //建立比原本大10的陣列
for(a=0;a<count;a++) //複製舊的陣列內容
tmp[a] = ch[a];
delete [] ch; // 刪除舊的資料
ch = tmp; // 繼承新的資料
count+=10;
}
num++;
ch[num-1] = in;
cout<<ch[num-1];

in = getch();
}
ch[num] = '\0';
cout<<endl<<endl<<ch<<endl<<endl;
system("pause");
return 0;
}

程式執行時,會先讀入字串直到使用者按下 Enter,接下來會把使用者輸入的字串重新再印出來。另外程式是使用 getch() 來讀取字串輸入,所以不必擔心作業系統給的暫存不夠大。

6 則留言:

  1. conio.h不是標準函式庫哦~~

    回覆刪除
  2. 另外,在宣告陣列長度時使用變數
    不是非常好的做法
    似乎只有C99的編譯器會過

    抱歉,我應該一次回完的

    回覆刪除
  3. 偷用其他函式庫被發現了 XD

    不用說也大概我要用 conio.h 裡面的哪個函式了

    我不太清楚其他編譯器會不會過,但是我用的 GCC 當編譯器,所以其他編譯器應該還OK。

    回覆刪除
  4. 呵呵,或許是我多話了,改用C++ Style String 如何 ?

    回覆刪除
  5. 哈,小弟不專業,受教受教!

    回覆刪除
  6. 真是受教了,真是及时雨啊,谢谢

    回覆刪除