在C中将字符串的一部分复制到另一部分

时间:2016-09-03 15:02:43

标签: c strstr strncpy ptrdiff-t

我在尝试将字符串的一部分复制到另一部分时遇到问题。鉴于这两个char指针:

line points at string cointaining: "helmutDownforce:1234:44:yes"
username points at: NULL

这是我的函数,它将这些指针作为输入:

char* findUsername(char* line, char* username){
    char* ptr = strstr(line, ":");
    ptrdiff_t index = ptr - line;
    strncpy(username, line, index);

    return username;
}

我在strncpy期间遇到分段错误。怎么会?我想要的结果是返回指向包含helmutDownforce的字符串的指针的函数。

2 个答案:

答案 0 :(得分:2)

此函数分配并返回一个新字符串,因此为避免内存泄漏,调用函数必须负责最终释放它。如果行中没有分隔符冒号,它将返回NULL

char* findUsername(char* line){
    char* ptr = strchr(line, ':');
    /* check to make sure colon is there */
    if (ptr == NULL) {
        return NULL;
    }

    int length = ptr - line;
    char *username = malloc(length+1);

    /* make sure allocation succeeded */
    if (username == NULL) return NULL;

    memcpy(username, line, length);
    username[length] = '\0';
    return username;
}

答案 1 :(得分:1)

根据strncpy的{​​{3}}:

the destination string dest must be large enough to receive the copy

因此,在调用malloc之前,您必须首先使用usernamestrncpy分配一些内存。