欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言字符串工具箱DIY之剔除字符串首尾的空白字符的str_trim函数

程序员文章站 2022-07-02 21:22:06
@Header File Named "string_toolbox.h" Contents of File "string_toolbox.h" Are as follows: #ifndef STRING_TOOLBOX_H_INCLUDED #define STRING_TOOLBOX_H_I ......

@Header File Named "string_toolbox.h"

Contents of File "string_toolbox.h"  

Are as follows:

#ifndef STRING_TOOLBOX_H_INCLUDED

#define STRING_TOOLBOX_H_INCLUDED

char *str_trim(const char *str);

#endif

 

@Source File Named "string_toolbox.c"

Contents of File "string_toolbox.c"  

Are as follows:

#include "string_toolbox.h"

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

char *str_trim(const char *str)
{
    size_t

i = 0,

j = strlen(str),

k = 0,

new_lenth;

// @Comment_1 

    while(isspace(str[i])){

      // @Comment_2

         ++i;
    }

   if(i == j) return "";

      // @Comment_3

    while(isspace(str[--j]));

      // @Comment_4

    new_lenth = j - i + 1;

      // @Comment_5

    char *result = (char *)

      malloc(new_lenth + 1);

    while(k < new_lenth){
         result[k++] = str[i++];
    }
    result[k] = '\0';


    return result;
}

 

@Source File  for Testing Named "main.c"

Contents of File "main.c"  

Are as follows:

 

#include "string_toolbox.h"
#include <ctype.h>
#include <string.h>

#define STR_CAT3(d, s1, s2, s3) (strcat(strcat(strcat(d, s1), s2), s3))

int main()
{
    char
        *str1 = "1",
        *str3 = "3",
        *str2[4] = {
         " \t 2\t2 \n \v \t ", // 12  23
         " \t 22 \n \v \t ", // 1223
         " \t 2 \n \v \t ", // 123
         " \t \n \v \t " // 13
        };

    int i = 0;
    while(i < 4){
        char dest_buf[8] = {'\0'};
        printf("%s\n",

      STR_CAT3(dest_buf,

      str1,

      str_trim(*(str2+i)),

      str3)

     );
        ++i;
    } 

    printf("%d\n", isspace('\0')); // 0

 

    return 0;
}

 

Postscripts

(1) size_t is type_alias of "unsigned int".

(2) Function void *malloc(size_t n_bytes); is declared in <stdlib.h>.

  It is used to dynamically allocate memory.

(3) Function size_t strlen(const char *str); is declared in <string.h>.

  It counts how many valid charaters (that is the amount of charaters before '\0') are in this string.

(4) Function char *strcat(char *destination_string_buf, const char *source_string); is  declared in <string.h>.

  It appends the source_string to the ending of the destination_string_buf on '\0'. The destination_string_buf should contain a C string, and be large enough to contain the concatenated resulting string.

(5) Function int isspace(int c); is declared in <ctype.h>.

  It checks whether c is a white-space character. For the "C" locale, white-space characters are any of :

' ' (0x20) space (SPC)
'\t' (0x09) horizontal tab (TAB)
'\n' (0x0a) newline (LF)
'\v' (0x0b) vertical tab (VT)
'\f' (0x0c) feed (FF)
'\r' (0x0d) carriage return (CR)

(5) Details of Indexed Comments (Like @Comment_N) Above

  1. 原字符串全部可访问的下标范围为闭区间[0, strlen(str)];
  2. printf("%d\n", isspace('\0')); 会输出0, 即'\0'不被作为空白字符;
  3. 满是空白字符,精简后即是空字符串咯;
  4. 因为isspace('\0')为假, 因此应直接从'\0'的前一个字符开始检测空白;
  5. 精简后得到的新字符串全部可访问的下标范围为闭区间[0, new_lenth];

 

Copyright NOT Fully Reserved © yawenunion@whatever.com On 20180403