我正在尝试实现我自己的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;
}
请告诉我为什么会发生这种情况,我该如何解决?谢谢!
答案 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;
}