例:
原始数据
char str[] = "abc d e fgh i jk l m ";
处理后
str[] = "abcdefghijklm";
思路:
1. p_space指向第一个空格字符
2. p_char指向p_space后的第一个非空格字符
3. 交换p_space和p_char的内容,且++p_space,使其指向下一个空格字符
4. 重复步骤2、3,直到p_space或p_char指向‘\0’
5. *p_space = '\0',结束算法
void remove_space(char *pStr)
{
char *p_space, *p_char;
if (pStr == NULL)
return;
//p_space指向第一个空格字符
for (p_space = pStr; *p_space != ' '; ++p_space);
//当p_space不指向字符串结尾时,寻找它后面的第一个非空格字符
while (*p_space != '\0')
{
for (p_char = p_space; *p_char == ' '; ++p_char);
if (*p_char == '\0')
break;
else
{
*p_space = *p_char;
*p_char = ' ';
++p_space;
}
}
*p_space = '\0'; //新的结束标记
return ;
}
算法改进
上面的算法中都是从p_space开始寻找第一个非空格字符,存在效率方面的不足,以下为改进版本
思路:
不从p_space开始寻找第一个非空格字符,而是从上一次的p_char开始寻找它后面的第一个非空格字符,流程如下
1. p_space指向第一个空格字符,p_seach_begin指向p_space后的第一个非空格字符
2. p_char指向p_seach_begin后的第一个非空格子字符
3. 交换p_space和p_char的内容,且++p_space,使其指向下一个空格字符,更新p_seach_begin为p_char
4. 重复步骤2、3,直到p_seach_begin或p_char指向‘\0’
5. *p_space = '\0',结束算法
void remove_space_v2(char *pStr)
{
char *p_space, *p_seach_begin,*p_char;
if (pStr == NULL)
return;
//p_space指向第一个空格字符
for (p_space = pStr; *p_space != ' '; ++p_space);
//p_seach_begin指向第一个非空格字符
for (p_seach_begin = p_space; *p_seach_begin == ' '; ++p_seach_begin);
while (*p_seach_begin != '\0')
{
for (p_char = p_seach_begin; *p_char == ' '; ++p_char);
if (*p_char == '\0')
break;
else
{
*p_space = *p_char;
*p_char = ' ';
++p_space;
p_seach_begin = p_char;
}
}
*p_space = '\0'; //新的结束标记
return;
}