鱼C论坛

 找回密码
 立即注册
查看: 3645|回复: 10

c/c++中strcpy问题

[复制链接]
发表于 2012-4-21 17:23:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在谭浩强中的《c++程序设计》中使用的是strcpy(str1,str2,2)的格式将str2中的前两个字符复制到str1的字符数组中,而同样是谭浩强的《c程序设计》一书中对于同样这一问题却使用的是strncpy(str1,str2,2),但是放在vc6中编译,前者无法通过编译,后者编译结果出现乱码,请说明下这是为什么,如果要将str2中前两个字符复制到str1中具体应该怎么做?谢谢。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-22 17:54:51 | 显示全部楼层
可以用memmove(str1,str2,2)内存拷贝。
将str2声明为string型的还可以用str2.copy(str1,2,0)
用strncpy()应该可以啊
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-22 19:53:08 | 显示全部楼层

用strncpy()出现乱码,比如这道程序:
#include<stdio.h>
#include<string.h>
main()
{char str1[10],str2[]="chain";
strncpy(str1,str2,2);
printf("%s",str1);
}
其结果为ch烫烫烫烫烫
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-22 23:52:46 | 显示全部楼层
你没有对str1初始化,其值为不确定,用strncpy(str1,str2,2)只是替换掉了不确定值的前两个字符,后面的还是不确定所以乱码。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-22 23:59:10 | 显示全部楼层
本帖最后由 剑蝶 于 2012-4-23 00:01 编辑

我试过用strcpy不初始化也不产生乱码,但用strncpy不初始化就有可能产生乱码
另外strcpy是两个参数,而strncpy是三个参数
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-23 08:35:01 | 显示全部楼层
未初始化的str1内存处为:CC CC CC CC...翻译过来就是:烫烫烫烫烫...

假设:char str1[10],str2[]="123";
则strcpy(str1,str2)之后,str1内存为:31 32 33 00 CC CC...
而用strncpy(str1,str2,2)之后为:31 32 CC CC CC...

由于字符串要以\x00结尾作为标志,所以strcpy之后结果是"123",而strncpy(str1,str2,2)之后是:
"12烫烫烫烫烫..."
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-23 08:36:07 | 显示全部楼层
建议初始化str1为00,即在定义时:char str1[10]={0x00};
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-23 10:19:05 | 显示全部楼层
littleevil 发表于 2012-4-23 08:36
建议初始化str1为00,即在定义时:char str1[10]={0x00};

恩,知道咯,谢啦。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-23 22:01:58 | 显示全部楼层
正在学习老师的零基础入门学习C语言
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-24 13:57:40 | 显示全部楼层
littleevil 发表于 2012-4-23 08:35
未初始化的str1内存处为:CC CC CC CC...翻译过来就是:烫烫烫烫烫...

假设:char str1[10],str2[]="123 ...

哦,懂咯,谢谢。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-24 16:25:22 | 显示全部楼层
若梦花开 发表于 2012-4-24 13:57
哦,懂咯,谢谢。。

这个问题我解释下吧!
其实我刚学习C语言的时候也碰到过这个问题,但后来自己调试加上查书还是解决了。
strcpy和strcnpy都是用来复制字符串的。
但是为什么strcnpy会出现很多“烫”乱码呢?而strcpy却不会?
关键的问题出现在这里。
首先strncpy(str1,str2,2);是把str2的前两个字符赋值给str1;
而strcpy(str1,str2,2);是把str2的整个字符串赋值给str1,但是必须strcpy足够大,能够容纳得下str2,否则会出错。
之所以strncpy(str1,str2,2);printf("%s",str1);会出现乱码,是因为str1没有字符串结束字符‘\0’,但是如果在最后加上一个字符串结束字符strncpy(str1,str2,2);str1[2] = '\0';就不会出现乱码了。
而strcpy(str1,str2,2);把str2的整个字符串赋值给str1包括结束字符'\0'。
'\0'这是区别字符串与字符数组的唯一区别,就像int a[40] = {1,2,3,4,5,6,7,8,9};这个数组a,你不可以用;printf("%s",a);输出一样,否则就会有乱码产生。

小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-12 21:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表