删除空格和制表符的函数

时间:2017-06-08 19:35:20

标签: c c-strings

我试图创建一个从给定字符串中删除空格和制表符的函数,但字符串中的第一个制表符或空格除外。当我使用我的函数时,它删除除第一个之外的空格和制表符,但它也删除第一个空格或制表符后的第一个字母。 例如> “ad ad ad”> “ad dad”而不是“ad adad” 那是为什么?

void RemoveSpacetab(char* source) {
    char* i = source;
    char* j = source;
    int spcflg = 0;

    while(*j != 0) {
        *i = *j++;

        if((*i != ' ') && (*i != '\t'))
            i++;
        if(((*i == ' ') || (*i == '\t')) && (spcflg == 0)) {
            i++;
            spcflg = 1;
        }
    }
    *i = 0;
}

2 个答案:

答案 0 :(得分:1)

您需要将源阵列和目标阵列分开,因为它们将变为不同的长度。你可以在复制像这样的字符之前找到起始位置,假设你将源和源的长度传递为char* source, int length(你也可以用strlen(source)来计算源的长度,然后你的函数可能看起来像这样:

int i = 0;
char* dest = malloc(sizeof(char) * length);
// Increment i until not space to find starting point.
while (i < length && (source[i] == '\t' || source[i] == ' ')) i++;

int dest_size = 0;
while (i < length) {
    if (source[i] != '\t' && source[i] != ' ') {
        // Copy character if not space to dest array
        dest[dest_size++] = source[i];
    }
    i++;
}
dest[dest_size++] = 0; // null terminator
// Feel free to realloc to the right length with 
//   realloc(dest, dest_size * sizeof(char))
return dest;

答案 1 :(得分:1)

两个if语句一个接一个地引起的问题。当您第一次检测到空格时,i会先于j

<强>解释

在第一个周期中,i也指向位置0和j。位置0的'a'将被自身覆盖,然后j向前移动到位置1。您的第一个if块会发现位置0处的字符不是空格而不是制表符,因此将i移动到位置1。

在第二个周期中,'b'将被自身覆盖,然后j移动到位置2,这是一个空格。第一个if发现位置1的'b'不是空格而不是标签,因此将i移动到位置2.现在第二个if发现i第一次指向空格并将其移至位置3,而j仍然指向位置2.

在第三个周期中,位置3的'a'将被位置2的空格覆盖,而j会被i追踪。

您的代码的可能修复:

#include <stdio.h>

void RemoveSpacetab(char* source) {
    char* i = source;
    char* j = source;
    char spcflg = 0;

    while(*j != 0) {
        *i = *j++;
        if(*i == ' ' || *i == '\t') {
            if(!spcflg) {
                i++;
                spcflg = 1;
            }
        }
        else {
            i++;
        }
    }
    *i = 0;
}

int main() {
    char my_string[] = "ad ad ad";
    RemoveSpacetab(my_string);

    printf("%s\n", my_string);
    return 0;
}