From Gossip@caterpillar

C Gossip: 字串長度、複製、串接

字串字 元陣 列 中說過,在C語言中,字串是一個字元陣列,最後一個字元以空字元'\0'作結尾,若要得知字串所含字元長度(不包括空字元),則可以使用strlen()函式:
size_t strlen(const char*);

size_t是unsigned型態,在大部份系統是定義為unsigned int,但在64位元系統中可以是unsigned long。strlen()會傳回字元陣列中第一個字元至空字元間的長度值:
#include <stdio.h> 
#include <string.h>

int main(int argc, char* argv[]) {
char input[80];
size_t length;

puts("請輸入字串...");
gets(input);

length = strlen(input);

printf("字串長度:%u\n", length);

return 0;
}

字串相關處理函式是定義在string.h中,所以要將之include,執行結果如下:
請輸入字串...
Just
字串長度:4

如果要進行字串複製,可以使用strcpy()函式,若要複製字串中若干字元內容,則可以使用strncpy():
char* strcpy(char*, const char*);
char* strncpy(char*, const char*, size_t);

第一個參數是目的字元陣列,第二個參數是來源字串,strncpy()第三個參數則是要複製的字元長度,要注意的是,strncpy()不會自動在目的陣列加上空字元,它只是單純的複製指定長度的字元,以下的範例示範strcpy()與strncpy():
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[]) {
char input[80];
char tmp[80];

puts("請輸入字串...");
gets(input);

strcpy(tmp, input);
printf("複製整個字串:%s\n", tmp);

// 重設所有字元為空字元
memset(tmp, '\0', sizeof(tmp));
strncpy(tmp, input, 4);
printf("複製部份字串:%s\n", tmp);

return 0;
}

在這個範例中,想要在使用strncpy()後可以將目的字串陣列當作字串來使用,所以使用memset()函式將所有字元重設為空字元,一個執行的範例如下所示:

請輸入字串...
Justin
複製整個字串:Justin
複製部份字串:Just

若要串接兩個字串,則要使用strcat(),若要串接部份字串,則可以使用strncat():
char* strcat(char*, const char*);
char* strncat(char*, const char*, size_t);

第二個參數的字串會串接到第一個參數之後,所以第一個參數必須保留足夠的空間作為串接時使用,以下範例示範這兩個函式的使用:
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[]) {
char str1[80] = "xyz";
char str2[] = "abc";

printf("串接前:%s\n", str1);

strcat(str1, str2);
printf("串接後:%s\n", str1);

strncat(str1, str2, 2);
printf("串接後:%s\n", str1);

return 0;
}

執行結果如下:

串接前:xyz
串接後:xyzabc
串接後:xyzabcab