在 C 語言中連線字串

Jinku Hu 2023年1月30日 2021年1月22日
  1. 在 C 語言中使用 strcatstrcpy 函式連線字串
  2. 在 C 語言中使用 memccpy 函式連線字串
  3. 在 C 語言中使用自定義函式連線字串
在 C 語言中連線字串

本文將為大家講解幾種在 C 語言中連線字串的方法。

在 C 語言中使用 strcatstrcpy 函式連線字串

strcat 是 C 標準庫字串工具的一部分,定義在 <string.h> 標頭檔案中。該函式接受兩個 char*引數,並將儲存在第二個指標處的字串追加到第一個指標處。由於 C 風格的字串以\0 字元結束,strcat 從空字元開始追加到目標字串。最後,一個新構造的字串的結尾以\0 字元結束。注意,程式設計師要負責在目標指標處分配足夠大的記憶體來儲存這兩個字串。

在這個解決方案中要利用的第二個函式是 strcpy,它同樣需要兩個 char*引數,並將第二個指標處的字串複製到第一個指標處。需要注意的是,strcpy 是用來將第一個字串複製到指定的 char 緩衝區,然後將目標指標傳遞給 strcat 函式。

這兩個函式都會返回目標字串的指標,這就使得鏈式呼叫成為可能。

#include <stdio.h>
#include <string.h>
#include <stdlib.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 <string.h>
#include <stdlib.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 <string.h>
#include <stdlib.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);
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C String