免费注册 查看新帖 |

Chinaunix

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

[C] 有人见过这种格式化输出么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-30 14:51 |只看该作者 |倒序浏览
大家好,  请问下面这种格式化输出怎么理解?

    printf("%2d: %.*s\n", i, substring_length, substring_start);
    //其中substring_start  为char *,substring_length和i为int

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2009-06-30 15:08 |只看该作者
%之后的*为输出的长度

论坛徽章:
0
3 [报告]
发表于 2009-06-30 16:10 |只看该作者
原帖由 hellioncu 于 2009-6-30 15:08 发表
%之后的*为输出的长度


那%号之后的点代表什么呢?
*的用法是标准的用法么?
如果substring_length是4的话,我是不是可以理解为最多格式化输出4个字符呢?

[ 本帖最后由 zboom 于 2009-6-30 16:14 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-06-30 17:31 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2009-06-30 17:59 |只看该作者
原帖由 luoleicn 于 2009-6-30 17:31 发表
%m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格,注意:如果n未指定,默认为0。

楼主看这个文章
http://hi.baidu.com/jiaju111/blog/item/dcd7fd8ba9a7fa1ac9fc7ae2.h ...



不错不错,很详细~~

论坛徽章:
0
6 [报告]
发表于 2009-06-30 18:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2009-06-30 21:14 |只看该作者

回复 #2 hellioncu 的帖子

*应该为后面指定输出的长度

论坛徽章:
0
8 [报告]
发表于 2009-07-01 12:29 |只看该作者

回复 #4 luoleicn 的帖子

多谢luoleicn 的回复,你给的那篇文章确实很详细,不过对于文章的描述还是有点疑问的:
“%m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格,注意:如果n
未指定,默认为0。”,是否应该是m未指定呢?
我今天翻了一下谭浩强那本《C程序设计(第二版)》(4.5 格式输入与输出),居然有例子:

int main()
{
/* %3.5s为我在例子基础上另加的 */
printf("%3s,%7.2s,%.4s,%-5.3s,%3.5s\n","CHINA","CHINA","CHINA","CHINA","CHINA");

}
测试结果:
CHINA,     CH,CHIN,CHI  ,CHINA
解释:
格式说明为“%.4s",即只指定了n,没指定m,自动使m=n=4,故占4列"
另外,这里的解释是说“m=n=4”,而不是“默认为0"

论坛徽章:
0
9 [报告]
发表于 2009-07-01 13:12 |只看该作者

回复 #8 zboom 的帖子

默认为左边,不指定的话,只输出左边M列

论坛徽章:
0
10 [报告]
发表于 2009-07-01 13:48 |只看该作者

回复 #6 xiaoQ008 的帖子

另外,按照6楼xiaoQ008的分析方法,分析vsnprintf函数对‘.’的处理可知点后面的数字被记录到precision变量中:
                /* get the precision */
                precision = -1;
                if (*fmt == '.') {
                        ++fmt;       
                        if (isdigit(*fmt))
                                precision = skip_atoi(&fmt);
                        else if (*fmt == '*') {
                                ++fmt;
                                /* it's the next argument */
                                precision = va_arg(args, int);
                        }
                        if (precision < 0)
                                precision = 0;
                }
在解析到‘s’时处理:
                        case 's':
                                s = va_arg(args, char *);
                                if ((unsigned long)s < PAGE_SIZE)
                                        s = "<NULL>";

                                len = strnlen(s, precision);

                                if (!(flags & LEFT)) {
                                        while (len < field_width--) {
                                                if (str <= end)
                                                        *str = ' ';
                                                ++str;
                                        }
                                }
                                for (i = 0; i < len; ++i) {
                                        if (str <= end)
                                                *str = *s;
                                        ++str; ++s;
                                }
                                while (len < field_width--) {
                                        if (str <= end)
                                                *str = ' ';
                                        ++str;
                                }
                                continue;
在这里,field_width是-1,所以上下两个while循环不执行,只执行中间的for循环,即将“%m.ns”中n个字符输出。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP