Try   HackMD

C-style string的處理

tags: C code
撰寫時間 : 2021/08/29

前言

注意此部分與C++的標頭檔string(屬於OOP中的class)不同。C語言使用string.hC++沿用C使用cstring

函數

計算類型函數

  • size_t (資料型態)
    Unsigned integral type,32位元4bytes;64位元8bytes

  • NULL
    等於\0,而\是跳脫字元(脫離原字元的意思)

  • strlen (長度) size_t strlen( const char *str ); 傳入一個字串 str,回傳這個字串的長度,而 '\0' 不計入長度(但 '\n' 計入)。其中的回傳值型態 size_t 通常是無號整數型別。


strcpy (複製)

char * strcpy ( char * destination, const char * source );
  1. 功能: 將 source 的值複製給 destination。不能用=指派字串,要用strcpy
  2. 型態: const char * source不代表一定要指派const,而是告訴使用者,所指派的值不會被變動。 等同於:
const char *sou1 = new char[11];
const char *sou2 = sou1;
  1. 範例
char *str1 = "C programming";
char str2[20];
strcpy(str2, str1);
  1. 範例2
    由於des儲存的是第一個位置,因此當想替換字串 Hi, I am Mary -> Hi, I am John
char *ch = new char[21];
strcpy(ch, "Hi, I am Mary");
char newname[] = "John";
strcpy(ch + strlen(ch) - strlen(newname), newname);
std::cout << ch << std::endl;

strcat (串接)

  1. 功能: 將 source 的內容,串接在 destination 原先內容的後面。
  2. 型態: char * strcat ( char * destination, const char * source );
  3. 範例:
char word[1000] = "1234";
strcat(word, "567");
std::cout << word << std::endl;

strcmp (比較)

  1. 功能: 從第一個字元開始逐一比對 str1 與 str2 的所有字元。比對過程若有不一樣的字元時:
ASCII比對 結果
str1 > str2 正值
str1 < str2 負值
str1 == str2 0
  1. 型態: int strcmp ( const char * str1, const char * str2 );
  2. 範例:
char word1[] = "abcd";
char word2[] = "Abcd";
int i = strcmp(word1, word2);

strstr (尋找)

  1. 功能: 運算出 str2 在 str1 中第一次出現的位置。若不存在結果為 NULL。
  2. 型態: const char * strstr ( const char * str1, const char * str2 );
  3. 範例:
char word1[] = "33551saber";
char *pc = strstr(word1, "551");
std::cout << pc << std::endl;
//輸出是551saber,因為字串取值會取到空字元

strtok (切割)

  1. 功能: 依照 delimiters 的內容切割 str。delimiters 中的各個字元為或的關係。str 的內容會被改變。
  2. 型態: char * strtok ( char * str, const char * delimiters );
  3. 範例:
char work[] = "abc,def,ghi.hfd";
char *tok = strtok(work, ",."); //"或"的關係
while(tok != NULL){ //NULL = /0(結束的控制字元)
    tok = strtok(NULL, ",."); //剩下的字符數組要使用NULL讀取
}

練習

  1. 題目: 讀取"{70, 12, 20, 50}",並儲存為整數數列
  2. 個人解答:
#include <iostream>
#include <cstring>

int main() {
	char work[] = "{70, 12, 20, 50}";
	char *work2 = new char[strlen(work)];
	strcpy(work2, work); //避免更改到原本的字符數組,因此進行複製
	int arr[10];
	int i=0;

	char *tok = strtok(work2, "{}, "); //delimiters 中的各個字元為"或"的關係
	while(tok != NULL){ //NULL = /0(結束的控制字元)
		arr[i++] = atoi(tok); //將字符數組轉換為int
		tok = strtok(NULL, "{}, "); //剩下的字符數組要使用NULL讀取
	}

	delete work2; //釋放heap空間,以免mem leak

	for (int j=0; j<i; j++){  //印出測試
		std::cout << arr[j] << std::endl;
	}
	return 0;
}

參考