关于去除字符串的頭尾的空格键(思路可以扩展到其他的符号)。
分为两种情况,
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;
}
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~~~