C语言删除字符串中所有空格的两种实现方法

阿澈
阿澈
发布时间:2026-10-15| 6人浏览过
原创

在使用C语言处理用户输入的文本时,经常需要清洗数据,例如去除字符串中所有的空格。本文通过两个具体的代码示例,分别演示了如何在单个字符数组中通过移动元素来“原地”删除空格,以及如何利用辅助数组进行字符过滤。这两种方法都涉及基础的数组遍历与条件判断逻辑。

基于内存移动的原地删除法

在处理此类问题时,如果题目限制只能定义一个字符数组,无法创建额外的缓冲区来存储结果,就需要采用“原地修改”的策略。其核心逻辑是:遍历时如果发现空格,就将该空格之后的所有字符整体向前移动一位,从而覆盖掉空格。

这种方法虽然直观,但在每次发现空格后都需要执行大量的赋值操作(q[a] = q[a+1]),时间复杂度较高,且需注意边界条件的控制。

第1步:定义变量与读取输入

首先定义足够大的字符数组用于存储输入,以及必要的索引和计数器变量。使用 gets 函数读取一行字符串(注:现代编程中建议使用更安全的 fgets,此处沿用原题逻辑)。

第2步:遍历并剔除空格

通过嵌套循环实现删除:
1. 外层循环遍历数组中的每个字符。
2. 内层 while 判断当前字符是否为空格。
3. 如果是空格,执行内层 for 循环,从当前位置开始,将后一个字符复制到前一个位置,实现前移。
4. 每删除一个空格,数组的有效长度需相应减一,以避免越界或重复检查。

#include <stdio.h>

int main()
{
	int i, x = 0, a, s = 100; // s 作为动态长度记录
	char q[100];
	
	printf("输入一个字符串:");
	gets(q);
	
	// 注意:实际开发中建议获取字符串真实长度 strlen(q) 替代固定值
	// 原题逻辑假设最大长度为100,并以此循环
	for (i = 0; i < s; i++)
	{
		// 如果当前字符是空格
		if (q[i] == ' ')
		{
			// 将空格后的所有字符前移一位
			for (a = i; a <= s; a++)
			{
				q[a] = q[a + 1];
			}
			// 删除后,当前位已被后一位填充,所以不要跳过下一位检查,同时长度减1
			s--;
			// 这里的原代码逻辑使用 while(z == q[i]) 配合自增x略显冗余
			// 直接调整 i 或在内部处理即可。为保持与原图一致性,我们保留核心逻辑
			// 但修正为更清晰的 if 结构以符合标准编程习惯
		}
	}
	puts(q);
	return 0;
}

逻辑说明:上述代码展示了基本思路。原草稿中的 while (z == q[i]) 写法在实际运行时可能会因为 i 未更新导致死循环或逻辑混乱,因此建议在实际工程中优化为标准的数组收缩逻辑。下图展示了程序运行时的典型输入输出效果:

使用辅助数组的过滤拷贝法

如果题目允许定义第二个字符数组,或者不要求“原地”修改,那么使用双指针或简单的计数索引进行拷贝是更高效、更不易出错的方法。这种方法的本质是建立一个映射关系:将所有非空格字符依次填入新数组的连续位置。

第1步:初始化双索引

定义源数组 a 和目标数组 b,以及指向目标数组写入位置的索引 k,初始值为 0。

第2步:遍历并过滤

遍历源数组 a 的每一个元素: 1. 判断当前字符是否不等于空格(!= ' ')。 2. 如果不是空格,则将其赋值给 b[k],并将写入索引 k 加 1。 3. 如果是空格,则跳过,不进行任何操作。

#include <stdio.h>

int main(void)
{
	char a[61], b[61]; // 假设最大串长不超过60,留有余地
	int i, k = 0;
	
	gets(a);
	
	for(i = 0; i < 61; i++) // 遍历整个分配的空间
	{
		// 这里主要依赖字符串终止符 '\0' 自然结束循环
		// 实际更严谨的做法是使用 while(a[i] != '\0')
		if(a[i] != ' ') 
		{
			b[k] = a[i];
			k++; 
		}
		// 遇到空格则直接忽略,不写入 b
	}
	b[k] = '\0'; // 重要:手动添加字符串结束符
	
	puts(b);
	return 0;
}

进阶变体:压缩连续空格

除了彻底删除空格,有时需求是将连续的空格合并为一个,或者仅保留一个。这可以通过判断当前字符与前一个字符的状态来实现:

/* 类似题型:输入一个字符串,将字符串中连续的空格符保留一个 */
#include <stdio.h>

int main(void)
{
	char a[61], b[61]; 			
	int i, k = 0;
	
	gets(a);
	
	for(i = 0; i < 61; i++)	
	{
		// 逻辑:如果是空格,且前一个字符也是空格,则跳过
		// 否则(包括非空格,或第一个空格),存入新数组
		if(a[i] == ' ' && i > 0 && a[i-1] == ' ') 	
		{ 
			continue; // 跳过多余的连续空格
		}
		else 
		{
			b[k] = a[i];
			k++;
		}
	}
	b[k] = '\0';
	puts(b);
}

以上就是C语言删除字符串中空格及相关处理的详细内容。这些基础操作是理解更复杂数据结构(如链表节点删除)的前置技能。更多关于C语言字符串优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。