| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1746 人关注过本帖
标题:求助,关于指针问题*s1++=*s2++
只看楼主 加入收藏
醒山
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:9
帖 子:463
专家分:2071
注 册:2015-5-25
收藏
得分:0 
根本不能运行
2015-08-26 21:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
单是这种没有花括号的风格,就是致错之源,他总不会抄错得那么齐全,花括号一个不剩。

授人以渔,不授人以鱼。
2015-08-26 21:57
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:3 
这段代码有两个错误,混淆常量和变量,边界问题。
char *s1="ABCD",*s2="CDEF";  s1 指向常量,容量小。后边的代码在s1末尾连接s2,后果不可预料。改为s1[110]="ABCD",这样"ABCD"可变,容量变大。但是,s1又变为常量,不能为左值,不支持++运算符,再申请一个指针变量指向s1[110].

程序代码:

 #include<stdio.h>

 int main()
{
    char s0[110]="ABCD",*s2="CDEF";
    char *ps1=s0,*ps2=s2,*s1=s0;
    while(*s1)
    s1++;
    while(*s1++=*s2++);
    printf("%s\n",ps1);
    printf("%s\n",ps2);
    return 0;
}
2015-08-26 22:51
醒山
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:9
帖 子:463
专家分:2071
注 册:2015-5-25
收藏
得分:0 
对的
2015-08-27 07:56
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 13楼 jklqwe111
你确定你这样解释正确?好像有点误人子弟吧。
s1、s2指向的是常量,但其自身是个指针变量,是支持自增、自减的。至于边界问题,完全是你自己臆想的。只要是合法定义,就不存在边界问题,如果你代码不做边界检查,你就是把所有内存都给你使用,仍然存在边界问题。

能编个毛线衣吗?
2015-08-27 09:20
醒山
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:9
帖 子:463
专家分:2071
注 册:2015-5-25
收藏
得分:0 
那你认为问题在那里?
2015-08-27 09:46
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 16楼 醒山
只需将“while(*s1++=*s2++);”改为“while(*s1++==*s2++);”即可编译通过,但输出的并非楼主想要的效果,楼主的代码只是移动了s1、s2指针值,对一开始ps1和ps2的值没有任何影响,所以显示的仍然是原值。

能编个毛线衣吗?
2015-08-27 10:26
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:3 
回复 17楼 wmf2014
wmf小斑竹  搭车问个小问题

类似这样的复合语句  

*t++=*s++  (是一个赋值语句 一个等号)

能通过测试案例的  得看人品  有时就不能得到正确答案

而相应的修改为

*t=*s
t++
s++

就可以准准的通过测试案例   可以释疑否

DO IT YOURSELF !
2015-08-27 10:34
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:0 
回复 15楼 wmf2014
何来误人子弟,我并没有说s1,s2不支持++操作,也没有说指针的自增操作有问题,我只是说定义了常量,又试图改变会出现问题,看这一句 *s1++=*s2++,其中有指针的自增操作,这是没有问题的,但是其中还包含了对指针所指向的内容的读取和写入,对s2的读取没有问题,那么对s1的赋值可以吗,再说边界问题,c语言中不能对你定义的区域进行自主检测,需要程序员自己控制,当你要使用的空间小于你定义的空间,就会越界,编译器并不检查边界,即使越界也会去执行,但结果如何,无法确定,原码中s1定义了5个字节,而他试图使用9个字节,这不是边界问题又是什么呢。
2015-08-27 10:40
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 18楼 wp231957
有吗?只要不是对常量赋值,我觉得都可以通过的,我测试的也是这样。

能编个毛线衣吗?
2015-08-27 10:46
快速回复:求助,关于指针问题*s1++=*s2++
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021071 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved