【问题标题】:Copying one part of a string to another in C在C中将字符串的一部分复制到另一部分
【发布时间】:2017-01-11 12:12:48
【问题描述】:

我在尝试将字符串的一部分复制到另一部分时遇到问题。鉴于这两个 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 的字符串的指针的函数。

【问题讨论】:

  • 您是否将NULL 指针传递给strncpy()
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • 将调用代码发布到findUsername()

标签: c strstr strncpy ptrdiff-t


【解决方案1】:

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

【讨论】:

  • 好奇:为什么在int length = ptr - line;中使用int类型而不是OP的ptrdiff_tsize_t,(malloc()接收的类型?
【解决方案2】:

根据manualstrncpy

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

所以你必须先用mallocusername分配一些内存,然后再调用strncpy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-26
    • 2015-02-05
    • 1970-01-01
    • 2011-03-01
    • 2011-01-08
    • 1970-01-01
    • 2023-03-16
    • 2014-02-14
    相关资源
    最近更新 更多