【问题标题】:C - Removing White spacesC - 删除空格
【发布时间】:2023-03-24 05:46:01
【问题描述】:

我正在尝试从从 txt 文件读取的大型数组中删除空格。 我要处理的数组的 strlen() 大约是 15,000~22,500。

这是我的代码:

#include <stdio.h>
#include <ctype.h>

void whiteSpace(char str[]){
    int i, j;
    for (i = 0; str[i] != 0; i ++){
        if (isspace(str[i])){
            for(j = i; str[j] != 0; j ++){
                str[j] = str[j + 1];
            }
        }
    }
}

这适用于短数组,但对于较大的数组,我必须使用两次 whiteSpace() 来消除所有空格?

我认为该算法是正确的,我不知道为什么它适用于短数组和较大(15,000~22,500)数组的故障,除非我调用该函数两次或三次。

谢谢。

【问题讨论】:

标签: c arrays char whitespace removing-whitespace


【解决方案1】:

它不适用于小型数组。如果连续有两个空格,就会报错。

问题是当它跳过一个空格时,它从不检查移位的字符是否也是一个空格。

有几种方法可以修复它。最简单但不是最好的方法是将您的 if 更改为 while

【讨论】:

    【解决方案2】:

    这是您完成任务的效率最低的方式,但您看到的具体问题是由连续多个空格引起的。想象一下,您正在i 循环中扫描,您会看到两个空格中的第一个。因此,您启动j 循环,将数组中的所有内容移到更靠近开头的一个字符。你移动的第一个字符是第二个空格,你把它放在第一个空格的位置。最终,你完成了移动,i 前进到下一个字符——它越过了你移动到第一个空格所在的第二个空格。现在缓冲区中还有一个空间,但 i 指向它,所以它会被留下。

    【讨论】:

    • 去除数组中所有空白的最有效方法是什么?
    • 一种方法是让两个索引(getput)在数组中向前移动。如果它们不相等,则将str[get] 复制到str[put]。如果str[get] 是一个空格,则增加get(但不要复制)。这样一来,所有不是空间的东西都会被压向阵列的前面。
    • 非常感谢!
    猜你喜欢
    • 2012-01-13
    • 1970-01-01
    • 2013-06-01
    • 2013-06-16
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多