在 C 語言中修剪字串

Jinku Hu 2023年1月30日 2021年2月28日
  1. 在 C 語言中使用自定義函式修剪字串的方法
  2. 在 C 語言中使用另一個自定義函式來修剪字串
在 C 語言中修剪字串

本文將介紹幾種在 C 語言中修剪字串的方法。

在 C 語言中使用自定義函式修剪字串的方法

字串修剪函式並不是標準 C 庫字串實用程式的一部分,也不是由符合 POSIX 標準的函式提供的,所以需要自己實現這些函式。在這個例子中,我們實現了名為 trimString 的函式,該函式接受一個單一的 char 指標引數,並返回修剪後的字串指標。注意,我們作為呼叫者,負責傳遞可以修改的字串。在本例中,我們使用 strdup 來複制 str1,當字串被使用時,應該使用 free 呼叫來釋放它。

trimString 函式的實現是這樣的,它對字串的字元逐個進行遍歷,當給定的是一個空格時,它將指標遞增一個。簡而言之,這個 while 迴圈將 char 指標點移動到第一個非空格字元,修剪字串的字首。接下來,檢查增量指標的值是否等於 null,意味著給定的字串沒有非空格字元;因此我們返回 null 表示錯誤情況。隨後的 while 迴圈通過逐個向後移動字串末端的指標來刪除字串末端的空格。一旦迴圈遇到非空格字元,它就停止,下一條語句將 0 字元放在它的末尾。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

char *trimString(char *str)
{
    char *end;

    while(isspace((unsigned char)*str)) str++;

    if(*str == 0)
        return str;

    end = str + strlen(str) - 1;
    while(end > str && isspace((unsigned char)*end)) end--;

    end[1] = '\0';

    return str;
}

int main(void) {
    const char *str1 = "  temporary string     ";

    printf("%s\n", str1);

    char *tmp = strdup(str1);
    printf("%s\n", trimString(tmp));

    free(tmp);
    exit(EXIT_SUCCESS);
}

輸出:

  temporary string     
temporary string

在 C 語言中使用另一個自定義函式來修剪字串

與之前的修剪函式類似,trimString2 的實現是為了去除字串兩邊的空格。第一個 while 迴圈計算字串末尾的空格數,第二個迴圈將指標移動到第一個非空格字元。在迴圈語句的末尾,len 包含由 strndup 函式生成的修剪後的字串中的字元數。注意,從 strndup 函式返回的指標應被呼叫者釋放,以避免記憶體洩漏。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

char *trimString2(char *str)
{
    size_t len = strlen(str);

    while(isspace(str[len - 1])) --len;
    while(*str && isspace(*str)) ++str, --len;

    return strndup(str, len);
}

int main(void) {
    char *str2 = "       temporary string  ";

    printf("%s\n", str2);

    char *s = trimString2(str2);
    printf("%s\n", s);

    free(s);
    exit(EXIT_SUCCESS);
}

輸出:

     temporary string  
temporary string
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