读书人

strcpy这样写为什么出错?解决方案

发布时间: 2012-02-15 12:09:44 作者: rapoo

strcpy这样写为什么出错?
下面这个strcpy是网上流传的标准答案,我删除了断言,没关系
可是运行后却出现了未知错误,估计是内存问题
谁可以解释下,感激不尽
或者给出答案也可以
还有一个问题,就是为什么要设置一个中间变量address
却没有修改address的值,最后却返回address,为什么不返回strDest呢?
#include "stdafx.h "

char *strcpy(char *strDest, const char *strSrc)
{
char *address = strDest; // 2分
while( (*strDest++ = * strSrc++)!= '\0 ') // 2分
return address ; // 2分
}

int main(int argc, char* argv[])
{
char* str1= "aaa ";
char* str2= "bbb ";
strcpy(str1,str2);
printf( "%s ",str1);
printf( "%s ",str2);
return 0;
}


[解决办法]
你写的代码有问题
char str1[]= "aaa ";
这样就运行正确了
[解决办法]
char* str1= "aaa ";
相当于:const char* str1= "aaa ";
[解决办法]
char* str1= "aaa ";
这里str1只是一个指针,你往一个指针变量里面放字符串
所以有问题
[解决办法]
char* str2= "bbb ";
str2常量,不能改写.不能作为左值.
[解决办法]
char* str1= "aaa ";

str1指向一个常量地址(存放字符串“aaa”),所以不可更改,也就不能完成copy了
[解决办法]
address 这个变量应该是编程习惯问题,防止在子函数调用后改变了传入的参数str1的值。虽然在你的函数里后面没有再使用str1。
char* str1= "aaa ";
相当于:const char* str1= "aaa ";
字符串字面值是常量 不能更改。
[解决办法]
char *str = "aaa ",等同于const char *str = "aaa ",是字符串常量。
[解决办法]
使用address变量是为了遵守一个约定:

strcpy()的返回值应指向目标字符串.

注意在经过while循环后, strDest已不再指向目标
字符串,而是指向其末尾. 因此先用address变量保存
其初始值以便返回时使用.
[解决办法]
char *strcpy(char *strDest, const char *strSrc)
{
char *address = strDest; // 2分
while( (*strDest++ = * strSrc++)!= '\0 ') // 2分
return address ; // 2分
}

int main(int argc, char* argv[])
{
char* str1=new char[80];
memset( str1, '\0 ',80 );
char* str2= "bbb ";
strcpy(str1,str2);
printf( "%s ",str1);
printf( "%s ",str2);
return 0;
}
[解决办法]
char* str1= "abc "
这是一个常量指针(或是指针常量,我老是分不清),就是指针指向的目标不能被修改。所以会出错。
声明成:
char str1[] = "abc "
就没有问题了。

循环体后边少一个分号,所以会和你预想结果不同。
至于返回值。一般来说。每个函数返回的值都为目标值,也就是SRC往DEST复制,所以返回DEST值。中间变量是为了孩子DEST指针在操作中改变。


修改后的程序为:
#include <stdio.h>


char *strcpy(char *strDest, const char *strSrc)
{
char *address = strDest; // 2分
while( (*strDest++ = * strSrc++)!= '\0 '); // 2分
return address ; // 2分
}

int main(int argc, char* argv[])
{
char str1[]= "aaa ";
char str2[]= "bbb ";
strcpy(str1,str2);
printf( "%s\n ",str1);
printf( "%s\n ",str2);
return 0;
}

[解决办法]
1.char* str1= "aaa ";相当于:const char* str1= "aaa ";所以str1是常量不能更改。
2.while()后面少分号估计是笔误漏写。
3.指针char *address = strDest;保存原串首地址。后来的*strDest++改变了strDest的地址,返回它的话到时返回的是串末。
[解决办法]
小弟在vc++中用strcpy,警告如下:

e:\madebyben\person\person\person.cpp(28) : warning C4996: “strcpy”被声明为否决的
c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 参见“strcpy”的声明
消息:“This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.”
这个VC++2005的警告啥意思??

[解决办法]
#include <stdio.h>


char *strcpy(char *strDest, const char *strSrc)
{
char *address = strDest; // 2分
while( (*address++ = * strSrc++)!= '\0 '); // 2分
return strDest ; // 我觉得这里这样才合适 // 2分
}

int main(int argc, char* argv[])
{
char str1[]= "aaa ";
char str2[]= "bbb ";
strcpy(str1,str2);
printf( "%s\n ",str1);
printf( "%s\n ",str2);
return 0;
}



[解决办法]
char *strcpy(char *strDest, const char *strSrc)
{
char *address = strDest; // 2分
while( (*strDest++ = * strSrc++)!= '\0 ') // 2分
return address ; // 2分
}
==================
XX的笔试题,,让我想起来,好像我昨天的最后一题写得有点错误

1,assert用来判断传进参数是否为NULL
2,address用来返回原str首地址,strDest已因++改变位置
3,char *str; 实际等于 const char *str;是不允许你改变值的.

---------------

楼主,我回答够详尽了吧,,把分给我吧,,,
楼主,我回答够详尽了吧,,把分给我吧,,,
楼主,我回答够详尽了吧,,把分给我吧,,,
[解决办法]
LS想分想疯了吧

也不看看人家的问题是什么!
[解决办法]

说句题外话,注意在C++中if(a!= '\0 ')与if(a)是等价的,因此
此题中的strcpy()函数其实可以写得更简洁些:

char *strcpy(char *strDest, const char *strSrc)
{
char *address = strDest;
while( (*strDest++ = * strSrc++));
return address ;
}

当然,不要忘了紧跟while()后面的分号. 我记得Stroustrup在
< <The C++ Programming Language> > 中还特意提到过这种独特写法.

读书人网 >C++

热点推荐