sprintf使用中的奇怪现象

Smile_2013 2019-01-14 10:53:06
使用sprintf想进行拼串,但是第二次sprintf之后dir变成了空串,百思不得其解
求大神帮忙解释一下!
#include <stdio.h>
#include <string.h>

#define DIR "/root/test/string/R%s/"

int main()
{
char dir[20];
char file[30];
char *id = "105";
sprintf(dir, DIR, id);
printf("sprintf before:%s\n", dir);
sprintf(file, "%srule.conf", dir);
printf("sprintf later%s\n", dir);
return 0;
}
运行结果为:
[root@localhost string]# ./a.out
sprintf before:/root/test/string/R105/
sprintf later
[root@localhost string]#
...全文
199 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2019-01-15
  • 打赏
  • 举报
回复
第一个sprintf没有越界,但是第二个file缓存已经越界了。越界操作的结果是未定的。因此建议考虑使用snprintf,这样通过输入数组的长度,来防止有越界访问。

另外,可以把file的长度扩大一倍试试。数组的长度建议定义为2的n次方长度。即扩大一倍变成64
northwesternwind 2019-01-15
  • 打赏
  • 举报
回复
字符串越界了。dir长度不够, file 长度不够。
定义这种数组的时候,一定要确保长度足够。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧