C语言删除字符串中所有空格的两种实现方法
在使用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语言字符串优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









