拥有strncpy()C ++

时间:2015-05-14 08:23:38

标签: c++ arrays strncpy

我正在尝试实现我自己的strncpy()版本,我找到了这个link的源代码。

但每次代码到达此代码Unhandled exception at 0x00411ad5 in exercise 2.exe: 0xC0000005: Access violation writing location 0x00417800.

时,我都会遇到while((x++ < n) && (*dest++ = *source++));

以下是完整的代码:

char *strncpy(char * destination, const char * source, size_t n){
        char *dest;
        dest = destination;

        size_t x=0;
        while((x++ < n) && (*dest++  = *source++)); //this is where unhandled exception occurs
        while(x++ < n){
            *dest++ = 0;
        }

        return dest;
    }

int main(){
    char *sample = "blue";
    char * sample2 = "red";

    cout << strncpy(sample, sample2, 5);
    getch();
    return 0;
}

请告诉我为什么会发生这种情况,我该如何解决?谢谢!

4 个答案:

答案 0 :(得分:2)

你不能写一个字符串常量(sample);写一个char数组代替:

int main(){
    char *sample = "blue";
    char buffer[5];

    cout << strncpy(buffer, sample, sizeof(buffer));
    getch();
    return 0;
}

答案 1 :(得分:2)

您的目的地是"blue",这是一个字符串文字,这是一个常量。因此它位于内存的只读部分(并由本地sample变量指向),因此在写入时会出错。

试试这个:

int main(){
    char sample[] = "blue";
    char * sample2 = "red";

    cout << strncpy(sample, sample2, 5);
    getch();
    return 0;
}

使sample成为本地可写内存中的数组。

答案 2 :(得分:2)

首先,已经向您解释过,您无法覆盖这样定义的字符串。
其次,你不能使用cout&lt;&lt; strncpy如果该函数返回指向复制字符串末尾的指针。

答案 3 :(得分:1)

您的计划有两个主要问题 第一个是函数strncpy必须返回destination而不是dest

char *strncpy(char * destination, const char * source, size_t n){
        char *dest;
        dest = destination;

        size_t x=0;
        while((x++ < n) && (*dest++  = *source++)); //this is where unhandled exception occurs
        while(x++ < n){
            *dest++ = 0;
        }

//        return dest;
        return destination;
    }

第二个是字符串文字是不可变的。任何修改字符串文字的尝试都会导致未定义的行为。

因此主函数应该按以下方式重写

int main(){
    char sample[] = "blue";
    char * sample2 = "red";

    cout << strncpy(sample, sample2, sizeof( sample ) );

    getch();

    return 0;
}

使用名为x的变量作为计数也是一种糟糕的编程风格。最好使用例如i

我会写函数更简单

char * strncpy( char *destination, const char *source, size_t n )
{
        char *dest = destination;

        while ( n-- && ( *dest++  = *source++ ) );
        while ( n-- ) *dest++ = '\0';

        return destination;
}