提取任意一對分隔符之間的子字串


分隔符是將字串與其他字元分開的字元,例如,在我們日常閱讀活動中的句子中,我們能夠區分不同的單詞,是因為它們被空格分隔開來。在數學和正則表示式中,我們使用()括號作為主要分隔符。

子字串的概念及其操作在程式設計中非常重要,尤其是在C語言中,C語言是一種用於編寫編譯器和彙編器的語言。在字串中識別分隔符,並將起始分隔符後的字元複製到另一個變數中,直到結束分隔符。

可以使用==和!=運算子來比較字串中的字元和使用者指定的界定符字元。

使用scanf()函式從使用者處接受字串,因此不允許空格作為字串的一部分。如果使用puts()或其他函式或方法,則可以獲得高階版本。

此程式使用陣列和字串處理的基本概念,不使用標頭檔案中提供的任何字串函式。可以使用字串比較、字串複製函式,但作為簡單邏輯練習,此程式是用非常基本的邏輯完成的。

使用的方法

方法1:使用substring()

方法2:使用函式

兩種方法各有優勢。方法1是一種直接的解決方案,有助於使用者理解字串操作的過程;而方法2透過使用函式,促進了更好的軟體設計原則和可維護性。

語法

在C程式語言中,提取任意一對分隔符之間的子字串是一種常見的程式設計任務。提取子字串的方法可能因具體問題要求和約束而異。然而,一種廣泛使用的方法是利用C標準庫中的strtok()函式。此函式用於根據指定的定界符將字串分解成一系列標記。該函式以原始字串和定界符作為輸入,並返回指向字串中找到的第一個標記的指標。為了提取所有子字串,可以重複呼叫該函式,其第一個引數為null指標,以獲得後續的標記。strtok()函式返回null指標表示字串的結尾。

char *strtok(char *str, const char *delim);

演算法

步驟1 - 宣告str1、str2、delim1、delim2,初始化為null。

步驟2 - 宣告整數變數len、n、I、subs

步驟3 - 從控制檯接受str1、delim1和delim2

步驟4 - 檢查並存儲長度到len中

步驟5 - 當n<輸入字串長度len時,檢查str1[n] == delim1

步驟6 - 如果是,則subs=n,中斷迴圈

步驟7 - 當str1[subs] != delim2時,使n=0

步驟8 - 將delim1之後的str1複製到str2,str2[n] = str1[subs],遞增n和subs

步驟9 - 列印str2,其中包含輸入字串減去()。

方法1:使用substring()

字串陣列操作的簡單分步實現具有幾個優點。它簡單易懂,這對初學者或學習程式設計的人來說非常有益。這種方法允許使用者看到程式操作字串的確切過程。但是,如前所述,這種方法有一些侷限性,例如不接受包含空格的字串並將長度限制為20個字元。使用gets方法可以克服字串大小的限制,但值得注意的是,由於潛在的緩衝區溢位和安全風險,gets方法已被棄用。

示例

此程式碼構成一個軟體,它根據兩個分隔符提取字串的一部分。第一個分隔符指定子字串的開頭,第二個分隔符指定子字串的結尾。輸入字串儲存在str1變數中,兩個分隔符定義為delim1和delim2變數。提取的子字串儲存在str2變數中。程式首先使用第一個分隔符識別子字串的起始位置,然後透過計算從起始位置到第二個分隔符定義的結束位置的字元數來計算其長度。然後呼叫Substring函式從原始字串中提取子字串並將其儲存在str2變數中。然後在螢幕上顯示提取的子字串。

#include <stdio.h>
#include <string.h>

void Substring(char *str2, const char *str1, int start, int n) {
   strncpy(str2, str1 + start, n);
}
int main() {
   // Predefined input values
   char str1[] = "Hello[world]!";
   char delim1 = '[';
   char delim2 = ']';

   char str2[100];
   int len1 = strlen(str1);
   int start, subs, n = 0;

   // Getting the position of substring based on delimiter
   while (n < len1) {
      if (str1[n] == delim1) {
         subs = n;
         break;
      }
      n++;
   }
   start = n;

   // Getting the length of substring
   if (str1[subs] == delim1) {
      n = 0;
      subs++;
      while (str1[subs] != delim2) {
         subs++;
         n++;
      }
      Substring(str2, str1, start + 1, n);
   }
   // Adding null character at the end
   str2[n] = '\0';
   printf("\nSub string is %s", str2);

   return 0;
}

輸出

Sub string is world 

方法2:函式

使用函式實現程式可以提供更模組化和組織良好的解決方案。它將程式碼分解成更小、可重用的部分,可以獨立測試和除錯。這種方法促進了更好的軟體設計原則和程式碼可讀性。透過建立函式,還可以輕鬆擴充套件程式的功能並提高其可維護性。

示例

此程式碼構成一個C語言軟體,它提取定義字串的一部分。字串宣告為字元陣列,分隔符在主函式中預先指定。Getpos函式用於確定字串中第一個分隔符(delim1)的位置。Copystr函式用於將兩個分隔符(delim1和delim2)之間的字元複製到新的字串中。原始字串的長度使用string.h庫中的strlen函式計算。然後使用printf函式在螢幕上顯示子字串。

#include <stdio.h>
#include <string.h>

void Getpos(char *str1, int len1, char delim1, int *subs) {
   int n = 0;
   while (n < len1) {
      if (str1[n] == delim1) {
         *subs = n;
         break;
      }
      n++;
   }
}

void Copystr(char *str1, char *str2, char delim1, char delim2, int subs) {
   if (str1[subs] == delim1) {
      int n = 0;
      subs++;
      while (str1[subs] != delim2) {
         str2[n] = str1[subs];
         subs++;
         n++;
      }
   }
}

int main() {
   // Predefined input values
   char str1[] = "Hello[world]!";
   char delim1 = '[';
   char delim2 = ']';

   char str2[100];
   int len1, subs;

   len1 = strlen(str1);

   Getpos(str1, len1, delim1, &subs);
   Copystr(str1, str2, delim1, delim2, subs);

   str2[strlen(str2)] = '\0';

   printf("\nSub string is %s", str2);

   return 0;
} 

輸出

Sub string is world

結論

C語言中的字串作為字元儲存在記憶體中,其中字串的每個字元或字母都可以單獨訪問和處理。字串的陣列操作使得對字串進行各種操作變得容易,例如連線、反轉、查找回文等等。這種靈活性使其在檔案操作和最小記憶體使用方面非常有用。

更新於:2023年7月20日

668 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.