免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3881 | 回复: 12
打印 上一主题 下一主题

关于sprintf [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-09 11:44 |只看该作者 |倒序浏览
有两个足够大的字符串:
str1="MMM";str2="VVVV";
执行:sprintf( str1, "%2.2s%s", str2, str1 );
期望是:str值为"VVMMM",可实际是“VVVVM”
在HP上,大家有谁知道为什么吗?又怎样用好的办法实现这个期望。谢谢

论坛徽章:
0
2 [报告]
发表于 2005-11-09 11:54 |只看该作者
int main(int argc, char * argv[])
{
        char mm[11], mk[82];

        memset ( mm, 0x0, 11 );
        memset ( mk, 0x0, 82 );
        strcpy( mm, "MMMMM");
        strcpy( mk, "VVVV");
/*label1*/
        printf("%2.2s%s", mk, mm );
        sprintf(mm, "%2.2s%s", mk, mm );
/*label2*/
        printf("mk:%s,[%s]n", mk, mm );

        return 0;
}
两个label输出分别是"VVMMMMM","VVVVVVV"
更搞不懂了,可能还是sprintf的机制问题?

论坛徽章:
0
3 [报告]
发表于 2005-11-09 11:59 |只看该作者
%2.2s,还是第一次见,我也不太清楚这个的用法,还有str1="MMM",是常量赋值,最好不要用。
可以这样:
char str_temp[8];
memset(str_temp, 0, ;
strncpy(str_temp, str2, 2);
strcat(str_temp, str2);
sprintf(str1,"%s", str_temp);

论坛徽章:
0
4 [报告]
发表于 2005-11-09 12:03 |只看该作者
谢谢,我在系统里肯定不会是用“=”的。不要用临时变量,用第三个变量是很容易解决的。

论坛徽章:
0
5 [报告]
发表于 2005-11-09 12:03 |只看该作者
是不是sprintf可能和环境更有关系

论坛徽章:
0
6 [报告]
发表于 2005-11-09 16:38 |只看该作者
LZ理解错误

论坛徽章:
0
7 [报告]
发表于 2005-11-09 16:39 |只看该作者
请您能否稍微具体一下

论坛徽章:
0
8 [报告]
发表于 2005-11-09 17:45 |只看该作者
str1是一个地址,手工模拟一下计算机操作不是就知道原因了?
要一个字节一个字节地模拟

论坛徽章:
0
9 [报告]
发表于 2005-11-09 18:10 |只看该作者
基本理解了,但还是有些不明白。我觉得第二个例子的输出应该是:VVVVMMM,应该是内存覆盖吧

论坛徽章:
0
10 [报告]
发表于 2005-11-09 18:34 |只看该作者
可以查一下手册里对这种源和目标相同的函数的行为有没有定义。

If copying takes place between objects that overlap as a result of a call to sprintf() or snprintf(), the results are undefined.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP