c语言实现剔除字符串空格的最优算法

       今天在群中看到有人问怎么用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;
}

运行示例:

你可能感兴趣的:(C语言,字符串,消除空格,最优算法)