在 C 語言中截斷字串

Jinku Hu 2021年3月21日
在 C 語言中截斷字串

本文將介紹有關如何在 C 語言中截斷字串的多種方法。

使用自定義函式和指標算術來截斷字串

由於 C 語言中的字串只是以空位元組-\0 終止的字元陣列,因此我們可以實現一個自定義函式,該函式將當前指標移至字串開頭指定的位數,並返回一個新的指標值。

但是請注意,有兩個問題。第一個是我們需要從左或右截斷給定字串的選項,第二個是從字串的右側移動指標是不夠的,因為需要插入空位元組來表示結尾。因此,我們定義了 truncString 函式,該函式將字串和幾個字元從字串中截斷。該數字可以為負,表示要從哪邊刪除給定的 chars。接下來,我們使用 strlen 函式檢索字串長度,這意味著使用者負責傳遞有效字串。然後,我們將長度與要截斷的字元數進行比較,然後繼續進行指標操作。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *truncString(char *str, int pos)
{
    size_t len = strlen(str);

    if (len > abs(pos)) {
        if (pos > 0)
            str = str + pos;
        else
            str[len + pos] = 0;
    }

    return str;
}

int main(void) {

    char *str1 = "the string to be truncated";

    printf("%s\n", str1);
    printf("%s \n", truncString(strdupa(str1), 4));
    printf("%s \n", truncString(strdupa(str1), -4));

    exit(EXIT_SUCCESS);
}

輸出:

the string to be truncated
string to be truncated
the string to be trunc

我們僅將 0 值分配給通過減去字串長度和傳遞的數字而得出的字元位置。因此,我們移動了字串的結尾,並可以使用舊指標列印其值。

另外,我們可以用相同的原型實現類似的功能 truncString2,但將字串截斷為作為第二個引數傳遞的字元數。數字的符號表示形成新字串的那一側,即,正整數表示左側,而負整數表示相反。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *truncString2(char *str, int pos)
{
    size_t len = strlen(str);

    if (len > abs(pos)) {
        if (pos > 0)
            str[pos] = 0;
        else
            str = &str[len] + pos;
    } else {
        return (char *)NULL;
    }

    return str;
}

int main(void) {

    char *str2 = "temporary string variable";

    printf("%s\n", str2);
    printf("%s \n", truncString2(strdupa(str2), 6));
    printf("%s \n", truncString2(strdupa(str2), -6));

    exit(EXIT_SUCCESS);
}

輸出:

the string to be truncated
string to be truncated
the string to be trunc
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