不工作/具有自己的Strncpy功能

时间:2013-05-17 16:18:19

标签: c string pointers strncpy

我正在使用自带函数的probs,它应该根据字符数量将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已停止工作(我的项目名称)。

3 个答案:

答案 0 :(得分:3)

应该是

*str1 = '\0';

因为它已经增加了。

简化版

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

您可以很容易地看到,当c1时,*str1获取*str2值,并且会递增,因此str1指向之后刚刚设置的值。因此,直接使用str1指针设置最终0以指示字符串的结尾可写为

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;
}

答案 1 :(得分:0)

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

答案 2 :(得分: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;
}