動態字串物件

高等 C 語言

簡介

字串

指標與陣列

函數

結構

物件導向

記憶體

檔案

錯誤處理

巨集處理

C 與組合語言

資料結構

動態字串

動態陣列

鏈結串列

雜湊表

開發環境

Make

Cygwin

MinGW

DevC++

wxDevC++

編譯器

gcc 編譯器

TinyCC 編譯器

LCC 編譯器

應用主題

CGI 程式

GNU 程式

視窗程式

影像處理

練習題

訊息

相關網站

參考文獻

最新修改

簡體版

English

歸根究底,字串誤用的問題,通常是由於 C 語言沒有提供一個標準的動態字串而造成的,如果您真的需要一個這樣的程式,那麼就應該採用一個支援動態字串的函式庫,然後將程式改寫如下。

範例四、字串連接的 C 程式 (動態字串版)

Str *s = StrNew();
for (i=0; i<100; i++) {
  StrAppend(s, token[i]);
}

這樣範例四的 C 語言程式,其實就與下列範例一中的 Java 程式,看來相差不大了,最大的差別是 C 語言沒有支援物件的概念而已。

範例一、字串連接的 Java 程式

String s = "";
for (i=0; i<100; i++)
  s = s + token[i];

要能撰寫像範例四這樣的一個程式,動態字串函式庫至少要能支援 StrNew() 與 StrAppend() 這兩個函數,那麼我們應該怎麼做呢?其實,要自己打造這樣一個程式相當容易,筆者可以馬上撰寫一個,如範例五所示。

範例五:實作動態字串函式庫

typedef struct Str {
  int len, size;
  char *s;
};

Str *StrNew();
void StrAppend(Str *str, char *s);

Str *StrNew() {
  Str *str = malloc(sizeof(Str));
  str->s = malloc(1);
  str->s[0] = '\0';
  str->len = 0;
  str->size = 1;
}

void StrAppend(Str *str, char *s) {
  int newLen = str->len + strlen(s);
  if (newLen+1 > str->size) {
    int newSize = max(str->size*2, newLen+1);
    char *t = malloc(newSize);
    sprintf(t, "%s%s", str->s, s);
    free(str->s);
    str->s = t;
    str->len = newLen;
    str->size = newSize;
  } else {
    strcat(&str->s[str->len], s);
    str->len += strlen(s);
  }
}

只要有了這樣一個函式庫,那麼我們就不需要為了 C 語言缺乏動態字串而困擾了,也就不需要每次都寫出像範例二或範例三這樣難看且沒有效率的程式了,而是直接寫出像範例四這樣乾淨,簡潔的函式庫了。

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License