当前位置:   article > 正文

[Linux C] linux C实现trim功能_c trim_string

c trim_string

Linux C中没有提供trim功能的API

实际编程过程中,很多地方会使用到类似trim功能的地方。

比如: 从文件中读取一行数据,存到字符串中。

但从文件读取的数据的末尾会包含 “\r\n”(windows文件格式)或者“\n”(linux 文件格式)

或者读取的数据前面会有空格和\t

但往往我们所关心的数据并不包含这些\r或者\n的字符串。

下面是自己编写的一个trim函数。

实现如下功能:

1.  提供三种模式

1.1 只从字符串首开始检测并删除指定字符

1.2 只从字符串尾部开始检测并删除指定字符

1.3 同时从字符串首部和尾部检测并删除指定字符

2.  可以自己指定所要trim的字符,可以指定多个字符

相关Code:

1. 函数原型如下所示:

 

void trim(char *source_string, const char *trim_string, trim_direction_mode_t trim_mode)

其中:

参数 source_string是需要进行trim操作的原始字符串

参数 trim_string是指定的需要在原始字符串中trim的字符

参数 trim_mode是指定trim的模式

其中 trim_direction_mode_t是自己定义的trim的模式的枚举,code如下:

 

 
  1. enum _trim_direction_mode

  2. {

  3. E_TRIM_MODE_NONE = 0x0,

  4. E_TRIM_MODE_FRONT = 0x1,

  5. E_TRIM_MODE_BACK = 0x2,

  6. E_TRIM_MODE_ALL = 0x3,

  7. };

  8. typedef enum _trim_direction_mode trim_direction_mode_t;

顾名思义,定义了4种模式:

 

E_TRIM_MODE_NONE <-- 不进行trim操作

E_TRIM_MODE_FRONT <-- 只对原始字符串的行首进行trim操作

E_TRIM_MODE_BACK <-- 只对原始字符串的行尾进行trim操作

E_TRIM_MODE_ALL<-- 对原始字符串既进行行首操作也进行行尾操作

2. trim函数code如下:

 

 
  1. static void trim(char *source_string, const char *trim_string, trim_direction_mode_t trim_mode)

  2. {

  3. int input_len = strlen(source_string);

  4. int trim_string_len = strlen(trim_string);

  5. char *input_value_ptr = source_string;

  6. const char *trim_string_ptr = trim_string;

  7.  
  8. int escape_flag = FALSE;

  9. int i = 0, j = 0;

  10.  
  11. assert(source_string != NULL);

  12. assert(trim_string != NULL);

  13.  
  14. if((trim_mode & E_TRIM_MODE_FRONT) != 0)

  15. {

  16. /* delete the front character */

  17. for (i = 0; i < input_len; i++)

  18. {

  19. /* cycle the trim string, if the character isn't one of trim string,

  20. * escape the cycle, and move the string */

  21. for (j = 0; j < trim_string_len; j++)

  22. {

  23. if (input_value_ptr[i] == trim_string_ptr[j])

  24. {

  25. break;

  26. }

  27. if(j == (trim_string_len - 1))

  28. {

  29. escape_flag = TRUE;

  30. }

  31. }

  32. if(escape_flag)

  33. {

  34. break;

  35. }

  36. }

  37. memmove(input_value_ptr, input_value_ptr+i,(input_len - i + 1));

  38. }

  39.  
  40. if((trim_mode & E_TRIM_MODE_BACK) != 0)

  41. {

  42. input_len = strlen(input_value_ptr);

  43. escape_flag = FALSE;

  44. /* delete the end character */

  45. for (i = input_len - 1; i >= 0; i--)

  46. {

  47. /* cycle the trim string, if the character isn't one of trim string,

  48. * escape the cycle, and move the string */

  49. for (j = 0; j < trim_string_len; j++)

  50. {

  51. if (input_value_ptr[i] == trim_string_ptr[j])

  52. {

  53. break;

  54. }

  55. if(j == (trim_string_len - 1))

  56. {

  57. escape_flag = TRUE;

  58. }

  59. }

  60. if(escape_flag)

  61. {

  62. break;

  63. }

  64. }

  65. input_value_ptr[i+1] = '\0';

  66.  
  67. }

  68.  
  69. return;

  70. }

函数作用就是按照trim mode,从trim_string中选取要trim的字符,对source_string进行trim操作。
其中,TRUE和FALSE是自己定义的boo变量

 

 

 
  1. #ifndef BOOL

  2. #define BOOL int

  3. #define TRUE 1

  4. #define FALSE 0

  5. #endif


 

 

代码执行示例:

 
  1. int main(int argc, char *argv[])

  2. {

  3.  
  4. char string[100] = "abcdefghijklmn";

  5. char tmp[100] = "";

  6.  
  7. strncpy(tmp, string, sizeof(tmp));

  8. printf("source string is : %s\n", tmp);

  9. trim(tmp, "abmn", E_TRIM_MODE_FRONT);

  10. printf("trim front string is : %s\n", tmp);

  11.  
  12.  
  13. strncpy(tmp, string, sizeof(tmp));

  14. printf("source string is : %s\n", tmp);

  15. trim(tmp, "abmn", E_TRIM_MODE_BACK);

  16. printf("trim back string is : %s\n", tmp);

  17.  
  18.  
  19. strncpy(tmp, string, sizeof(tmp));

  20. printf("source string is : %s\n", tmp);

  21. trim(tmp, "abmn", E_TRIM_MODE_ALL);

  22. printf("trim front and back string is : %s\n", tmp);

  23.  
  24. return 0

  25.  
  26. }


运行结果如下:

source string is : abcdefghijklmn
trim front string is : cdefghijklmn
source string is : abcdefghijklmn
trim back string is : abcdefghijkl
source string is : abcdefghijklmn
trim front and back string is : cdefghijkl

 

转载请注明出处:http://blog.csdn.net/jibing57/article/details/7448692

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/217480
推荐阅读
相关标签
  

闽ICP备14008679号