社区
C语言
帖子详情
为什么这个strcat用不起?
fxc123
2004-10-23 05:41:35
char* Strcpy(char* des,char* sour)
{
char* temp=des;
while(*temp)
temp++;
while(*temp=*(sour++))
temp++;
return des;
}
问题在第一个while循环,用
while(*temp)
temp++;
就可以。
为什么呢?
...全文
601
37
打赏
收藏
为什么这个strcat用不起?
char* Strcpy(char* des,char* sour) { char* temp=des; while(*temp) temp++; while(*temp=*(sour++)) temp++; return des; } 问题在第一个while循环,用 while(*temp) temp++; 就可以。 为什么呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
37 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
liujingfu123
2004-10-25
打赏
举报
回复
晕了……在程序正确的前提下还是把程序的可读性放在首要位置吧…… 过分追求代码的简洁就会使程序看起来很费神的……
cxjddd
2004-10-24
打赏
举报
回复
到底是 strcat 还是 strcpy >_<
zhangfjj
2004-10-24
打赏
举报
回复
*temp++ ===>*(temp++) ===> *temp temp++
先取值作运算,后++
-----
先做++,temp加1,但temp++的值是作自增运算前temp的值
*(temp++)是取表达式temp++的值,所以。。。
road1981
2004-10-24
打赏
举报
回复
复杂的表达式是错误的根源...Bjarne大大的话是真理
一叶还真不知秋
2004-10-24
打赏
举报
回复
那是,最少一个可分开,一个不可分开嘛。
烂笔头Danky
2004-10-24
打赏
举报
回复
虽然在语法上*temp++;是等价于*temp;temp++;但在不同时候还是会有不同的!
一叶还真不知秋
2004-10-24
打赏
举报
回复
char temp[4];
char *p = temp;
temp[0] = 'a';
temp[1] = 'b';
temp[2] = 'c';
temp[3] = 0;
char c = *p++;===> c = 'a'; p->temp[1]
一叶还真不知秋
2004-10-24
打赏
举报
回复
没错啊,只是在while(*temp++);的单个循环中temp的值不变,该轮循环结束后temp就变了。
zhangfjj
2004-10-24
打赏
举报
回复
楼上的,看看后缀运算符再说吧。^_^
一叶还真不知秋
2004-10-24
打赏
举报
回复
*temp++ ===>*(temp++) ===> *temp temp++
先取值作运算,后++
zhangfjj
2004-10-24
打赏
举报
回复
注意*temp++等价于*(temp++)
zhangfjj
2004-10-24
打赏
举报
回复
while(*temp++)在判断了*temp的值为假后不会马上退出
=====================
不对!
while(*temp++)
;
在对*temp++进行判断,先temp++,由于是后缀,temp++表达式的值并不变,所以*temp++还是指向原来的字符。
一叶还真不知秋
2004-10-24
打赏
举报
回复
孺子可教
fxc123
2004-10-24
打赏
举报
回复
也就是说
while(*temp++)在判断了*temp的值为假后不会马上退出
要等*temp++再执行一次后才会结束?
zhangfjj
2004-10-24
打赏
举报
回复
#include <stdio.h>
char* Strcat(char* des,char* sour)
{
char* temp=des;
while(*temp++)
;
//要象你那么用,由于多移动了一次,所以要加上下面的语句
//这样就正确了
temp--;
while(*temp=*(sour++))
temp++;
return des;
}
void main()
{
char str1[80]="abcd";
char *p="efg";
printf("%s\n",str1);
Strcat(str1,p);
printf("%s\n",str1);
}
zhangfjj
2004-10-24
打赏
举报
回复
while(*temp++)
;
与
while(*temp)
temp++;
它们还是有不同的。
假设temp指向str[]="abcd"
对于第一个循环
循环次数 判断的*temp++ temp指针指向了
1 'a' 'b'
2 'b' 'c'
3 'c' 'd'
4 'd' '\0'
5 '\0' '\0'后面的字符去了,多移动了一个,所以这里引起了问题
出现了你的错误。
而对于第二个循环,
循环次数 判断的*temp temp++;,移动指针指向
1 'a' 'b'
2 'b' 'c'
3 'c' 'd'
4 'd' '\0'
5 '\0' 退出循环,temp没有移动
这就是问题的所在
zhangfjj
2004-10-24
打赏
举报
回复
差不多了
fxc123
2004-10-24
打赏
举报
回复
懂了
关键就是*(temp++)
取得是上一次的值
对不?
zhangfjj
2004-10-24
打赏
举报
回复
为什么不等?
char* Strcpy(char* des,char* sour)
{
char* temp=des;
while(*temp)
temp++;
while(*temp=*(sour++))/*<-------------这里写成下面的形式*/
temp++;
return des;
}
while(*temp++=*(sour++))
;
是可以的
bluwindhrt
2004-10-24
打赏
举报
回复
while(*temp++);
不等于:
while(*temp) temp++;
加载更多回复(17)
C语言中为什么认为
strcat
()函数不安全?
strcat
()函数由于未检查目标字符串空间,可能导致缓冲区溢出和安全漏洞。为确保安全,推荐使用strncat()和strlcpy()等安全替代函数。,
【C学习-踩坑记录】使用
strcat
();函数后,程序后边的代码不执行
本文深入探讨了在使用
strcat
函数时常见的数组越界错误,通过实例演示了如何正确设置数组长度避免此问题,强调了理解数组长度的重要性。
C字符串操作
strcat
/
strcat
_s详解
本文聚焦C语言中
strcat
函数,介绍其功能、声明、参数及返回值,指出该函数不安全,不检查内存重叠和空间是否足够。给出忽略使用该函数时警告的方法,分析不满足使用条件时的情况。还提供解决措施,如使用
strcat
_s函数和C++的string函数。
strcat
函数解析
本文介绍了
strcat
函数的功能及使用,它是用于在已有字符串末尾追加其他字符串。详细解析了
strcat
的实现原理,并通过调试验证了其实现方式。此外,还模拟实现了
strcat
函数,强调了安全性和正确性。同时指出使用strcpy追加字符串会导致无限循环和系统崩溃的问题。
strcat
strcat
函数在C语言中存在安全隐患,可能导致内存溢出和系统崩溃。
strcat
_s提供了一种安全的实现,通过指定目标字符串的长度防止溢出。然而,由于指针按值传递的特性,直接使用str1 =
strcat
(str1,str2)可以避免地址问题。在使用
strcat
时需要注意检查输入是否为NULL以及是否需要重新分配空间。 119911643,5658945,缓存异常处理:解决数据不一致的策略,['数据一致性', '缓存管理', '并发控制', '数据库操作']
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章