今天在群中看到有人问怎么用c语言将字符串中的所有空格删除,当时就想到了创建一个字符串数组buff利用for循环将字符串中的字符一个个拷过来,遇到' '(或者32)就continue。后来人家和我说还可以再优化,然后审视了一下我这个算法,时间复杂度已经是o(n)了,不可能再降了,所以要优化为最简就只能是降低空间的损耗了:即在字符串上直接进行操作,把空格用后面的字符串填充;要实现这种功能,理所当然的就想到了指针,由于直接用数组名称本身就是一个指针,就只用创建一个指针来指向空格后面字符,将字符赋给空格后,原字符所在位置置为空格,两个指针同时向后移动一步,如此循环,知道,指向字符的指针移动到数组末尾(即指针指向的值为'\0')。下面是我算法的实现:
#include
#include
void remove_blank(char *ch)
{
char *c;//指向字符串的字符处
while (*ch != ' ')
{
if (*ch == '\0')
{
//字符串中没有空格,直接返回
return;
}
ch++;
}//将blank指针指向第一个空格位置
//让c指针指向出现空格后的第一个字符串
c = ch + 1;
while (c == ' ')
{
c++;
}
while (*c != '\0')
{
if (*c != ' ')
{
//将空格换为后面出现的字符,换过去的字符置为空格
*ch = *c;
*c = ' ';
ch++;
}
c++;
}
*ch = '\0';
return;
}
int main()
{
char ch[100];
char *blank, *c;//前者指向字符串空格处,后者指向字符串字符处
printf("Please enter you string: ");
gets_s(ch, 100);
remove_blank(ch);
printf("newch = %s, len = %d\n", ch, strlen(ch));
return 0;
}
运行示例: