当前位置: 技术问答>linux和unix
自己写的strcpy为什么拷贝输出汉字会乱码呢?
来源: 互联网 发布时间:2017-05-10
本文导语: #include char* strcpy1(char* des , const char* src) { char* strc = des; while((*des++ = *src++)); return strc; } int main(void) { char* strdes = ""; const char* strsrc = "abcdef"; strcpy1(strdes , strsrc); printf("拷贝后的结果是:%s " , strdes); return 0...
#include
char* strcpy1(char* des , const char* src)
{
char* strc = des;
while((*des++ = *src++));
return strc;
}
int main(void)
{
char* strdes = "";
const char* strsrc = "abcdef";
strcpy1(strdes , strsrc);
printf("拷贝后的结果是:%s " , strdes);
return 0;
}
|
strcpy 的前提是(前置条件):
1)目标地址单元( des 所指的)不是只读的,即是可写的.
2)目标地址单元的容量(des 应该是数组)是足够的,可以容纳要拷贝的字符串.
3)源地址单元是个字符串(包括字符串常量).
strcpy 的结果是(后置条件)
1)目标地址单元的内容,是和源地址单元一样的字符串.
即目标地址的 等于(源字符串长度+1)个字符的所有位置字符,都和源同一位置的字符相同.
2)返回目标地址单元的地址.
PS:
你的strcpy1,写的算是是对的.
你的主程序中,调用strcpy的代码(测试代码?)是错误的
1)常量字符串是不可写的,不满足第一条前置条件.
2)目标地址单元的容量,不能保证内存足够放置源字符串大小的字符串.
不满足第二条前置条件.
3)所以3楼是对的,YTerrenceLau已经给你答案了,你没有采纳.
4)写程序,最好同时写调试代码(主要是加断言)
5)如果,你知道,你写的程序,做什么的,怎样使用,就不会出现这种错误.
所以有人提倡,写代码先写测试.
6)因为你不知道strcpy ,实际做了些什么,逻辑是怎样的,所以测试代码写错了.
所以6楼版主说,拷贝逻辑,错的一塌糊涂。
1)目标地址单元( des 所指的)不是只读的,即是可写的.
2)目标地址单元的容量(des 应该是数组)是足够的,可以容纳要拷贝的字符串.
3)源地址单元是个字符串(包括字符串常量).
strcpy 的结果是(后置条件)
1)目标地址单元的内容,是和源地址单元一样的字符串.
即目标地址的 等于(源字符串长度+1)个字符的所有位置字符,都和源同一位置的字符相同.
2)返回目标地址单元的地址.
PS:
你的strcpy1,写的算是是对的.
你的主程序中,调用strcpy的代码(测试代码?)是错误的
1)常量字符串是不可写的,不满足第一条前置条件.
2)目标地址单元的容量,不能保证内存足够放置源字符串大小的字符串.
不满足第二条前置条件.
3)所以3楼是对的,YTerrenceLau已经给你答案了,你没有采纳.
4)写程序,最好同时写调试代码(主要是加断言)
5)如果,你知道,你写的程序,做什么的,怎样使用,就不会出现这种错误.
所以有人提倡,写代码先写测试.
6)因为你不知道strcpy ,实际做了些什么,逻辑是怎样的,所以测试代码写错了.
所以6楼版主说,拷贝逻辑,错的一塌糊涂。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。