C++ 拥有strncpy()C++;
我正在尝试实现我自己版本的strncpy(),我从中找到了一个源代码 但在练习2.exe中,我在0x00411ad5处遇到了一个C++ 拥有strncpy()C++;,c++,arrays,strncpy,C++,Arrays,Strncpy,我正在尝试实现我自己版本的strncpy(),我从中找到了一个源代码 但在练习2.exe中,我在0x00411ad5处遇到了一个未处理的异常:0xC0000005:访问冲突写入位置0x00417800。每次代码到达此代码时((x++
未处理的异常:0xC0000005:访问冲突写入位置0x00417800。
每次代码到达此代码时((x++
以下是完整的代码:
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;
}
char*strncpy(char*目的地,const char*源,大小){
char*dest;
目的地=目的地;
尺寸x=0;
while((x++ 无法写入字符串常量(sample
);请改为写入char
数组:
int main(){
char *sample = "blue";
char buffer[5];
cout << strncpy(buffer, sample, sizeof(buffer));
getch();
return 0;
}
intmain(){
char*sample=“蓝色”;
字符缓冲区[5];
cout您的目标是“blue”
,这是一个字符串文字,是一个常量。因此,它位于内存的只读部分(由本地示例
变量指向),因此在写入时会出错
试试这个:
int main(){
char sample[] = "blue";
char * sample2 = "red";
cout << strncpy(sample, sample2, 5);
getch();
return 0;
}
intmain(){
字符样本[]=“蓝色”;
char*sample2=“红色”;
cout首先,已经向您解释过不能覆盖这样定义的字符串。
第二,你不能使用cout你的程序有两个主要问题
第一个是函数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;
}
您无法覆盖为文字保留的内存。发生错误的原因是您写入了只读字符串,sample
。您不是想返回目标
,而不是已超过末尾的dest
?谢谢,异常已得到解决。但输出有点奇怪。它没有复制插入的内容ide示例2,它给出了奇怪的符号。->已解决,返回时出错,应该返回目标而不是指针。“无法使用您是否意识到我们讨论的是问题中的代码?该代码返回递增的dest,而不是destinationrue问题的代码现在执行此操作,但考虑到编写“我自己版本的strncpy()”的目的”-在返回dest
之前,它仍然存在错误,一旦修复返回dest
cout
将开始工作。尽管现有实现中存在额外的错误,但这一点很好。
int main(){
char sample[] = "blue";
char * sample2 = "red";
cout << strncpy(sample, sample2, sizeof( sample ) );
getch();
return 0;
}
char * strncpy( char *destination, const char *source, size_t n )
{
char *dest = destination;
while ( n-- && ( *dest++ = *source++ ) );
while ( n-- ) *dest++ = '\0';
return destination;
}