2014-02-07 32 views
1

我打电话低于该是用C语言来获取儿童安全d。添加额外的空格在修剪

char *getParent(char *child) 
{ 
    int len = strlen(child); 
    char *parent; 
    parent = strdup(substring(child, 0, len - 4)); 

    return parent; 

} 

char *substring(const char* str, int beg, int n) 
{ 
    char *ret = malloc(n+1); 
    strncpy(ret, (str + beg), n); 
    *(ret+n) = '\n'; 

    return strdup(ret); 
} 

孩子的父功能是 - “11112222” 现在我期待输出 - “1111”,但这个功能1111之后还会增加额外的空间,如'1111 ---我在这里获得空间----'。 这个功能有什么问题?

+0

'substring'是你编程的函数还是库的一部分? – user1781290

+1

@CyrilFougeray不,strlen()绝对不包含终止符,它不是字符串长度的一部分。 'strlen(“”)'为0. – unwind

+0

'*(ret + n)='\ n';'确实添加了换行符。你需要添加一个0:'*(ret + n)='\ 0';' – user1781290

回答

3

此:

*(ret+n) = '\n'; 

是错误的,它应该是:

*(ret+n) = '\0'; 

终止字符串。你正在添加一个换行符,而不是一个终止符,因此不能产生一个有效的字符串。

另外,我建议prefering索引,因为这是一个有点清洁语法:

ret[n] = '\0'; 

,当然,你应该依靠前检查malloc()返回值。

UPDATE:而且天哪,删除strdup(),它现在是完全没有意义的,你已经malloc()编新的字符串。

这应该只是:

char * substring(const char *str, size_t beg, size_t n) 
{ 
    char *ret = malloc(n + 1); 
    if(ret != NULL) 
    { 
     strncpy(ret, str + beg, n); 
     ret[n] = '\0'; 
    } 
    return ret; 
} 

这还是假设偏移量和长度是有效的,并且str是非NULL

+0

谢谢,也不要使用'strdup'很多..它工作正常。 – Sidd

+1

@sidd:不完全,它泄漏,'strdup'是不必要的。 –

+0

@KarolyHorvath Gaah,完全错过了,谢谢! – unwind