如何删除动态char数组中的前导空格?

时间:2015-01-05 15:46:42

标签: c arrays string malloc

我需要从C中的动态字符数组中删除前导空格。我的应用程序几乎可以工作,但它在开头只留下一个空格。如何摆脱给定文本中的所有前导空格?我不应该使用string.h中的函数。继承我的代码:

    #include <stdio.h>
#include <stdlib.h>

int mystrlen(char *tab)
{
    int i = 0;
    while(tab[i] != '\0')
    {
        i++;
    }
    return i;
}

char* ex6(char *tab)
{
    int spaces = 0, i, j = 0, s = 0;
    for(i=0; tab[i] != '\0'; i++)
    {
        if (tab[i] == ' ')
            spaces ++;
        else
            break;
    }

    spaces -= 1;

    char *w = (char*) malloc (sizeof(char) * (mystrlen(tab) - spaces + 1));
    for(i=0; tab[i] != '\0'; i++)
    {
        if (tab[i] == ' ')
        {
            ++ s;
        }
        if(s > spaces)
        {
            w[j] = tab[i];
            j ++;
        }
    }
    w[j] = 0;
    return w;
}

int main()
{
    char txt[] = "        Hello World";

    char *w = ex6(txt);
    printf("%s\n", w);

    free(w);
    w = NULL;

    return 0;
}

3 个答案:

答案 0 :(得分:3)

就地修改字符串允许以相当紧凑的方式去除前导空格,因为您不需要计算结果字符串的长度:

/* No includes needed for ltrim. */

void ltrim( char *s )
{
    const char *t = s;
    while ( *t && *t == ' ' )
        ++t;

    while ( ( *s++ = *t++ ) )
        ;
}

#include <stdio.h>

int main()
{
    char txt[] = "        Hello World";

    ltrim(txt);
    printf("%s\n", txt);

    return 0;
}

答案 1 :(得分:2)

问题出在spaces -= 1行。你回去1个空间。

答案 2 :(得分:1)

您可以使用指针算法向前移动tab指针,然后计算字符串中的剩余字符,然后为新字符串分配空间并将每个字符复制到新分配的空间。

这是没有strings.h

的方法
char* ex6(char *tab)
{
    int   i;
    char *w;
    while ((*tab == ' ') && (*tab != '\0'))
        tab++;
    w = malloc(mystrlen(tab) + 1);
    i = 0;
    while (*tab != '\0')
        w[i++] = *tab++;
    w[i] = '\0';
    return w;
}