How do I trim leading/trailing whitespace in a standard way?

来源:互联网 发布:计算复杂性 口头算法 编辑:程序博客网 时间:2024/06/07 09:41

http://stackoverflow.com/questions/122616/how-do-i-trim-leading-trailing-whitespace-in-a-standard-way

关于去除字符串的頭尾的空格键(思路可以扩展到其他的符号)。

分为两种情况,

1. 第一种为可以对此字符串改变的,如字符数组,堆中(calloc和malloc)分配的空间,还有一些buffer(TCP传过来的,不过也是通过以上方法来放的,只是感觉分一下,呵呵)。

char *trimwhitespace(char *str){  char *end;  // Trim leading space  while(isspace(*str)) str++;  if(*str == '\0')  // All spaces?    return str;  // Trim trailing space  end = str + strlen(str) - 1;  while(end > str && isspace(*end)) end--;  // Write new null terminator  *(end+1) = '\0';  return str;}


2. 第二种为无法对传入的字符做出改变的,那就需要你自己申请一片空间(数组,堆都可以)来放改变之后的字符串。

char *trimwhitespace(char *str){  char *end;  // Trim leading space  while(isspace(*str)) str++;  if(*str == '\0')  // All spaces?    return str;  // Trim trailing space  end = str + strlen(str) - 1;  while(end > str && isspace(*end)) end--;  // Write new null terminator  *(end+1) = '\0';  return str;}size_t trimwhitespace(char *out, size_t len, const char *str){  if(len == 0)    return 0;  const char *end;  size_t out_size;  // Trim leading space  while(isspace(*str)) str++;  if(*str == '\0')  // All spaces?  {    *out = '\0';    return 1;  }  // Trim trailing space  end = str + strlen(str) - 1;  while(end > str && isspace(*end)) end--;  end++;  // Set output size to minimum of trimmed string length and buffer size minus 1  out_size = (end - str) < len-1 ? (end - str) : len-1;  // Copy trimmed string and add null terminator  memcpy(out, str, out_size);  out[out_size] = '\0';  return out_size;}

后记:经过测试,木有发现bug状况,逻辑比较简单,先对传入的字符串进行判断,看看是不是空或者纯空格符,然后消除头和尾,再传出来。

            看老外的讨论,对第一个有疑义,就是假如你传入的是动态生成的,那么你需要自己在main函数(假设在main里面调用)自己free掉,不然内存泄漏了~~~当然数组无所谓了~~~

            恩,最好在注释里面说明下~~~


ps:大家看看有没有bug~~~