0

我有一个自己的函数的问题,应该根据字符的数量将 str2 复制到 str1 。

char * strncpy_own(char * str1, char * str2, int c)
{
    int i;
    for( i = 0; i < c; i++, str1++, str2++ )
    {
        *str1 = *str2;
    }

    *(str1 + 1) = '\0';

    return str1;
}

请帮助,当它启动时它立即终止并说:CLearningsss 已停止工作(我的项目名称)。

4

3 回答 3

3

它应该是

*str1 = '\0';

因为它已经增加了。

在简化版本中

while (c-- > 0) *str1++ = *str2++;

您可以很容易地看到 when cis 1*str1获取*str2值并递增,因此str1指向刚刚设置的值因此直接使用str1指针设置final0来表示字符串的结束可以写成

while (c-- > 0) *str1++ = *str2++;
*str1 = 0;

(实际上'\0'表示 char 值为零,因此直接写入0也可以)

此外,(感谢@Guillaume_Morin 提到)该函数应该更好地返回一个指向结果字符串(str1)开头的指针,并且您需要为此保留初始str1的副本,因为它稍后会递增:

char * strncpy_own(char * str1, char * str2, int c) {

    char *str1copy = str1;

    while (c-- > 0) *str1++ = *str2++;
    *str1 = 0;

    return str1copy;
}
于 2013-05-17T16:24:48.090 回答
0

是不是提前给str1和str2分配了内存?每个字符串需要 c + 1 个字节;c + 2 用于变异字符串,因为您有另一个答案指出的错误;-)

于 2013-05-17T16:25:48.483 回答
0
char *strncpy_my(char *str1, char *str2, size_t size){
    char *ret = str1;
    while(size>0){
        if(*str2=='\0')break;
        *str1++ = *str2++;
        --size;
    }
    while(size>0){
        *str1++ = '\0';
        --size;
    }
    return ret;
}
于 2013-05-17T16:37:54.203 回答