在 C 語言中連線字串
Jinku Hu
2023年10月12日
本文將為大家講解幾種在 C 語言中連線字串的方法。
在 C 語言中使用 strcat
和 strcpy
函式連線字串
strcat
是 C 標準庫字串工具的一部分,定義在 <string.h>
標頭檔案中。該函式接受兩個 char*
引數,並將儲存在第二個指標處的字串追加到第一個指標處。由於 C 風格的字串以\0
字元結束,strcat
從空字元開始追加到目標字串。最後,一個新構造的字串的結尾以\0
字元結束。注意,程式設計師要負責在目標指標處分配足夠大的記憶體來儲存這兩個字串。
在這個解決方案中要利用的第二個函式是 strcpy
,它同樣需要兩個 char*
引數,並將第二個指標處的字串複製到第一個指標處。需要注意的是,strcpy
是用來將第一個字串複製到指定的 char
緩衝區,然後將目標指標傳遞給 strcat
函式。
這兩個函式都會返回目標字串的指標,這就使得鏈式呼叫成為可能。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef MAX
#define MAX 100
#endif
int main() {
const char* str1 = "hello there 1";
const char* str2 = "hello there 2";
char buffer[MAX];
strcat(strcpy(buffer, str1), str2);
printf("%s\n", buffer);
char buffer2[MAX];
strcat(strcpy(buffer2, "Hello there, "), "Josh");
strcat(buffer2, "!\nTemporary...");
printf("%s\n", buffer2);
exit(EXIT_SUCCESS);
}
輸出:
hello there 1hello there 2
Hello there, Josh!
Temporary...
在 C 語言中使用 memccpy
函式連線字串
前一種方法最大的缺點是執行效率低下,對 strcpy
函式儲存的第一個字串進行冗餘迭代。
而 memccpy
則糾正了這個問題,高效地處理兩個字串。memccpy
從源 char*
複製到目標指標的位元組數不超過使用者指定的數量,只有在源字串中找到給定字元時才停止。memccpy
返回指向目標緩衝區中最後儲存的字元的指標。因此,兩個 memccpy
呼叫可以與前一個方法類似地連鎖進行。第一個字串被使用者複製到預分配的緩衝區,第二個字串被追加到第一次呼叫 memccpy
返回的指標上。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef MAX
#define MAX 100
#endif
int main() {
const char* str1 = "hello there 1";
const char* str2 = "hello there 2";
char buffer[MAX];
memccpy(memccpy(buffer, str1, '\0', MAX) - 1, str2, '\0', MAX);
exit(EXIT_SUCCESS);
}
輸出:
hello there 1hello there 2
在 C 語言中使用自定義函式連線字串
另外,如果 memccpy
在你的平臺上不可用,你可以定義一個自定義函式實現同樣的例程。concatStrings
是一個例子,它將一個字元從一個指標複製到另一個指標,直到找到指定的字元。請注意,在這兩個例子中,我們指定空位元組\0
作為停止的字元。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef MAX
#define MAX 100
#endif
void* concatStrings(void* restrict dst, const void* restrict src, int c,
size_t n) {
const char* s = src;
for (char* ret = dst; n; ++ret, ++s, --n) {
*ret = *s;
if ((unsigned char)*ret == (unsigned char)c) return ret + 1;
}
return 0;
}
int main() {
const char* str1 = "hello there 1";
const char* str2 = "hello there 2";
char buffer[MAX];
concatStrings(concatStrings(buffer, str1, '\0', MAX) - 1, str2, '\0', MAX);
printf("%s\n", buffer);
exit(EXIT_SUCCESS);
}
作者: Jinku Hu