免费注册 查看新帖 |

Chinaunix

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

[C] 关于snprintf打印格式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-26 11:49 |只看该作者 |倒序浏览
string verinum::as_string() const
{
      assert( nbits_%8 == 0 );
      if (nbits_ == 0)
            return "";

      string res;
      bool leading_nuls = true;
      for (unsigned idx = nbits_ ;  idx > 0 ;  idx -= 8 ) {
            char char_val = 0;
            V*bp = bits_+idx;

            if (*(--bp) == V1) char_val |= 0x80;
            if (*(--bp) == V1) char_val |= 0x40;
            if (*(--bp) == V1) char_val |= 0x20;
            if (*(--bp) == V1) char_val |= 0x10;
            if (*(--bp) == V1) char_val |= 0x08;
            if (*(--bp) == V1) char_val |= 0x04;
            if (*(--bp) == V1) char_val |= 0x02;
            if (*(--bp) == V1) char_val |= 0x01;
            if (char_val == 0 && leading_nuls)
                  continue;

            if (char_val == '"' || char_val == '\\') {
                  char tmp[5];
                  snprintf(tmp, sizeof tmp, "\\\%03o", char_val);
                  
                                  res = res + tmp;
            } else if (char_val == ' ' || isgraph(char_val)) {
        res = res + char_val;

            } else {
                  char tmp[5];
                  snprintf(tmp, sizeof tmp, "\\\%03o", char_val);
                  res = res + tmp;
            }
      }
      return res;
}


请问
1。标示代码中snprintf输出结果是怎样的?

[ 本帖最后由 fineamy 于 2008-7-26 11:50 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-07-26 14:20 |只看该作者
把 char_val  表示的char 表示为 八进制 只保留3位, 不足三位前面补零. 同时前面加\
比如
char_val = 'a'
的话
表示为 \141
把这个和\0 共五位 保存到 tmp 中

论坛徽章:
0
3 [报告]
发表于 2008-07-26 14:50 |只看该作者

谢谢,

不太明白snprintf(tmp, sizeof tmp, "\\\%03o", char_val); 中的三个\".
第一个'\'应该是转意控制符,
第二个'\'是转意符号,
那第三个'\'呢,也是转意控制符号吗,转后面'%'的意吗?
如果是那后面'%03o'就不对了。
所以,请问下第三个'\'是什么意思?

论坛徽章:
0
4 [报告]
发表于 2008-07-26 16:06 |只看该作者
\\\%03o
转义后为:
\%03o
其中,前两个\\转义为\,后面的\%转义为%

论坛徽章:
0
5 [报告]
发表于 2008-07-26 17:12 |只看该作者

谢谢,

还是没搞清楚啊!
问题出现了."\\\%03o", 中"%03o"代表的是一"变量".该变量的识别是靠'%'字符.于是,显然这里'%'是不能被转意的.否则"%03o"就变成普通字串了.

所以,觉得写成"\\%03o"倒可以理解!

[ 本帖最后由 fineamy 于 2008-7-26 17:13 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-07-26 19:38 |只看该作者

回复 #5 fineamy 的帖子

转义字符只是为了让程序员能够从键盘输入某些特殊字符,编译器进行转义处理,例如,

在编译时
\\\%03o
被转义为
\%03o

之后,程序运行时,\被直接输出,%03o被用来控制变量的输出

另外,这里的\%转义可以直接使用%,不需要转义
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP