strcpy 指针问题
#include "stdio.h"
#include "string.h"
void main()
{
char *p="abcdefg";
p++;
printf("%d",strlen(strcpy(p,"ABCD")));
}
答案:4
为什么p++;
printf("%d",strlen(strcpy(p,"ABCD"))); 为什么这句中的p指针没有往后移动
问题点数:0、回复次数:28Top
1 楼cssin(Steven Liu)回复于 2005-04-01 01:18:43 得分 0
strcpy会把字符串末尾的'\0'同时拷贝的,而当函数strlen发现'\0'即停止计算了,所以答案自然是4了Top
2 楼cssin(Steven Liu)回复于 2005-04-01 01:20:31 得分 0
另外你可以把printf该成下面的代码试试
printf("%s\t%d\n", p, strlen(p));Top
3 楼ALAN_1999(试试看:))回复于 2005-04-01 03:24:37 得分 0
改成如下这样怎么样?
#include "stdio.h"
#include "string.h"
void main()
{
char *p="abcdefg";
strcpy(p,"ABCD");
p++;
printf("%d",strlen(p));
}
Top
4 楼sapphirez()回复于 2005-04-01 07:18:01 得分 0
strcpy只Copy到'\0'为止,它表示字符串的结束Top
5 楼MagicCarmack(MagiC++)回复于 2005-04-01 08:03:43 得分 0
楼主你的程序能运行么??
我在Dev-C++ 4.9.9中是不能运行的
char *p="abcdefg";
strcpy(p,"ABCD");
这样做能行吗??
Top
6 楼kobefly(科比--网络学习中)回复于 2005-04-01 08:43:16 得分 0
char *p="abcdefg";
strcpy(p,"ABCD");
这样做能行吗??
这段代码当然不行拉
p指向常量字符串的啊
怎么可以strcpy呢
Top
7 楼skywgs(浪迹天涯)回复于 2005-04-01 08:51:51 得分 0
在TC里能运行,而且是对的,在VC6.0里执行到strcpy(p,"ABCD");就出错:内存不可写!!!Top
8 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-04-01 08:54:01 得分 0
char *p="abcdefg";
strcpy(p,"ABCD");
这样做能行吗??
这段代码当然不行拉
p指向常量字符串的啊
怎么可以strcpy呢
===========
同意。Top
9 楼ptb1212(天狗)回复于 2005-04-01 09:01:55 得分 0
char *p="abcdefg";
strcpy(p,"ABCD");
这样做能行吗??
这段代码当然不行拉
p指向常量字符串的啊
怎么可以strcpy呢
===========
这是不可以的
用strcpy前必须保证p有空间,也就是需要用数组定义或者用malloc申请Top
10 楼herrycsdn(卓一凡)回复于 2005-04-01 09:38:05 得分 0
char *p="abcdefg";
p++;
printf("%d",strlen(strcpy(p,"ABCD")));
/////////////////
p是一个常量字符串,不能改变的啊Top
11 楼xy_star(追求无限)回复于 2005-04-01 10:31:36 得分 0
首先这个程序是错误的,你能运行可能是编译器没有实现C++的部分特性。
char *p="abcdefg";是定义在堆上的常量;可以改变p的值,不可以改变p指向的内容的值
然后strlen(strcpy(p,"ABCD"))) == strlen("ABCD");Top
12 楼freememe()回复于 2005-04-01 13:00:15 得分 0
程序是在TC3.0中运行的
#include "stdio.h"
#include "string.h"
void main()
{
char *p="abcdefg";
p++;
printf("%d",strlen(strcpy(p,"ABCD")));
}
答案:4
printf("%d",strlen(strcpy(p,"ABCD"))); 为什么"ABCD"是覆盖"abcd"而不是覆盖"bcde"Top
13 楼freememe()回复于 2005-04-01 13:15:26 得分 0
main()
{
char *p;
p="abcdefg";
printf("%s\n",p);
p++;
printf("%s\n",p);
printf("%d\n",strlen(strcpy(p,"ABCD")));
}
答案:
abcdefg
bcdefg
4
那么:
printf("%d",strlen(strcpy(p,"ABCD"))); 为什么"ABCD"是覆盖"abcd"而不是覆盖"bcde"
Top
14 楼pijiupaopao(啤酒泡泡)回复于 2005-04-01 13:29:35 得分 0
#include "stdio.h"
#include "string.h"
void main()
{
char p[]="abcdefg";
printf("%s%d",p,strlen(strcpy(&p[1],"ABCD")));
}
//===========================================
aABCD
4
为什么是4,不是5呀?Top
15 楼snippet_cn()回复于 2005-04-01 13:57:08 得分 0
注意1:char *p;char p[]中两个p是不一样的
注意2:char *p="abcdefg";p的值是可以变的,p指向的字符串是常量字符串,是不能改变的,新的编译器均如此
注意3:strcpy会拷贝字符串中的‘\0’Top
16 楼jinus(燃冰)回复于 2005-04-01 15:39:59 得分 0
很奇怪啊,
char *p="abcdefg";
里面p是指向一个常量地址的,
strcpy(p,"ABCD")
是无法改变这个常量字符串的值地,所以编译虽可以通过,
一运行就会出现内存错误,程序崩溃.Top
17 楼jinus(燃冰)回复于 2005-04-01 15:47:51 得分 0
在tc里可以运行的话,关于:
printf("%d",strlen(strcpy(p,"ABCD"))); 为什么"ABCD"是覆盖"abcd"而不是覆盖"bcde"
其实,"ABCD"既没有覆盖"abcd"也没有覆盖"bcde",只是p丢弃了原来指向的内存地址,
而重新指向新的字符串常量"ABCD"的地址了.这时候p与以前的"abcdefg"已经没有
任何关系了.以前的"abcdefg"虽然还在内存里放着,但是它的位置已经找不到了,
这就是内存泄露.
对不对?大侠指点一下.Top
18 楼Sisopp(书呆子)回复于 2005-04-01 16:01:19 得分 0
char* p = "abcdefg";
常量字符串,内容不能改变。Top
19 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-04-01 17:01:26 得分 0
常量字符串不能修改内容的
用数组 char[]Top
20 楼wind5110(叶之落)回复于 2005-04-01 20:28:03 得分 0
C没有字符串类,我是头疼的要死。Top
21 楼xxxdg(学习中)回复于 2005-04-01 21:17:02 得分 0
回复人: jinus(燃冰) ( ) 信誉:100 2005-04-01 15:47:00 得分: 0
在tc里可以运行的话,关于:
printf("%d",strlen(strcpy(p,"ABCD"))); 为什么"ABCD"是覆盖"abcd"而不是覆盖"bcde"
其实,"ABCD"既没有覆盖"abcd"也没有覆盖"bcde",只是p丢弃了原来指向的内存地址,
而重新指向新的字符串常量"ABCD"的地址了.这时候p与以前的"abcdefg"已经没有
任何关系了.以前的"abcdefg"虽然还在内存里放着,但是它的位置已经找不到了,
这就是内存泄露.
对不对?大侠指点一下.
--------------------------------------------------------
NO!
常量不可更改,这是原则, TC3我没试过,一会儿可以试一下;
你说的这种情况理论上是不存在的,
strcpy函数确实是拷贝数据不是拷贝地址
这种情况下不叫做内存泄露, 因为常量数据在程序运行完毕之后是可以归还给操作系统的.Top
22 楼du51(郁郁思扬)回复于 2005-04-02 00:35:02 得分 0
char *p="***********"里面的***********是不可改变的.如*p="@@@@@@@@@@@"就出现错误.
但是p=0可以.p的值是可变的.也就是说,p可以指向这一常量,也可以不指向它.而这个常量本身不能被改变.
char str[]中str是一个地址.是不可改变的.
strcpy是从下标0开始copy直到连'\0'也挎进来.
注意.strcpy拷贝前提是有一个空间存在.对一个空指针进行操作.无法通过编译的.Top
23 楼vsong(房价越来越高,所以,好男人越来越少……)回复于 2005-04-02 11:31:00 得分 0
指针没有分配空间怎么能用strcpy的?
能编译的过就奇怪了!Top
24 楼liubingqian(海风)回复于 2005-04-02 13:07:36 得分 0
一些古董级编译器是可以编译楼主的代码的,新的编译器编译不过。Top
25 楼crcr(游侠)回复于 2005-04-02 14:03:14 得分 0
注意1:char *p;char p[]中两个p是不一样的
注意2:char *p="abcdefg";p的值是可以变的,p指向的字符串是常量字符串,是不能改变的,新的编译器均如此
注意3:strcpy会拷贝字符串中的‘\0’
在tc里可以运行的话,关于:
printf("%d",strlen(strcpy(p,"ABCD"))); 为什么"ABCD"是覆盖"abcd"而不是覆盖"bcde"
其实,"ABCD"既没有覆盖"abcd"也没有覆盖"bcde",只是p丢弃了原来指向的内存地址,
而重新指向新的字符串常量"ABCD"的地址了.这时候p与以前的"abcdefg"已经没有
任何关系了.以前的"abcdefg"虽然还在内存里放着,但是它的位置已经找不到了,
这就是内存泄露.
Top
26 楼showlie(想长膘的小猪……)回复于 2005-04-02 14:37:36 得分 0
strcpy函数的原型为:char* strcpy(char *,char *);
注意一下strcpy函数的返回类型就知道为什么strlen回返回4了。Top
27 楼xhltoo(晨风)回复于 2005-04-04 14:13:54 得分 0
关注!Top
28 楼bcboycn(雨后新竹)回复于 2005-04-05 21:49:38 得分 0
你用的是strcpy,之后p的内容就是“ABCD”了。你可以在程序的最后加一行printf("%s",p);试试。Top




