如何返回干净的字符串

时间:2014-11-17 22:24:25

标签: c pointers char dynamic-allocation

我尝试返回一个干净的字符串(在字符串的开头或结尾没有空格)
所以我使用动态分配和指针,

char* killspace(char *a)
{
    char *enda = NULL;
    int i = 0, spaceS = 0, spaceE = 0, bigend = 0 , out = 0, taille = strlen(a); 
    do
    {
        if (a[i] == ' ')
        {
            spaceS++;   
        }
        else
        {
            out = 1;
        }
        i++;
    } while (out == 0);
    out = 0;
    do
    {
        if (a[taille] == ' ')
        {
            spaceE++;
        }
        else
        {
            out = 1;
        }
        taille--;
    } while (out == 0);
    bigend = (spaceE + spaceS);
    // new size
    enda = (char *)calloc((strlen(a)-bigend), sizeof(char));
    i = 0;
    for (int j = spaceS; j < (strlen(a)-spaceE); j++)
    {
        enda[i] = a[j];
        i++;
    }
    return(enda);
    free(enda);

}

bigend它在字符串的开头和结尾处是空白的nombre 但作为回报,我得到了我的干净的字符串+ caractre like(ýýýý«««««««««îþîþþþ) 抱歉我的英语不好:(

2 个答案:

答案 0 :(得分:3)

将起始地址更改为字符串,需要(1)将地址发送到包含字符串作为参数的指针,以便可以更改或(2)从函数返回指向修剪字符串的新开头的指针。后者可能是你最好的选择。这是一个例子:

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

char *trimstr (char *s)
{
    while (isspace(*s))     /* while space, increment pointer   */
        s++;

    char *p = s;            /* pointer to string s              */
    while (*p) p++;         /* advance pointer to end of s      */
    p--;                    /* decrement pointer off null-term  */

    while (isspace(*p))     /* while space, set new end of str  */
    {
        *p = 0;
        p--;
    }

    return s;               /* return pointer to trimmed string */
}

int main () {

    char mystring[] = "  some string with leading/trailing WS  ";
    char *p = mystring;

    printf ("\n  Original String: '%s'\n\n", mystring);

    p = trimstr (mystring);

    printf ("  Trimmed String : '%s'\n\n", p);

    return 0;
}

<强>输出:

$ ./bin/trimstr

  Original String: '  some string with leading/trailing WS  '

  Trimmed String : 'some string with leading/trailing WS'

以这种方式解决问题通常会导致更短的代码尝试执行“index-shuffle”以在字符串中向下移动所有字符以覆盖前导空格。但是,“index-shuffle”没有任何问题,你只需要特别注意偏移,并记住也要偏移null-terminator

如果您对保存代码行感兴趣,可以按如下方式编写trimstr函数的更紧凑,尽管稍微不易阅读的版本:

char *trimstr (char *s)
{
    while (isspace(*s)) s++;        /* while space, increment pointer   */
    char *p = s;                    /* pointer to string s              */
    while (*p) p++;                 /* advance pointer to end of s      */
    while (isspace(*(--p))) *p = 0; /* while space, set new end of str  */
    return s;                       /* return pointer to trimmed string */
}

答案 1 :(得分:0)

我在我的情况下发现了问题,我在字符串的末尾添加了一个限制器enda[i] = '\0';,它对我有用