在C printf格式化输出中需要帮助

时间:2012-10-31 06:41:28

标签: c printf

我正在显示分区表,表格显示如下:

Number     Device name       Partition type      Size in MB
------------------------------------------------------------
1           /dev/sda1         NTFS                    300
2           /dev/sda2         *Win95 FAT32             99
3           /dev/sda3         Unknown                 128
4           /dev/sda4         NTFS                  19472
120         /dev/sda120       NTFS                   3000

*=Active partition

现在显示以上内容,我们使用格式化输出printf,格式字符串为

"%-6d=partition number    %-25.25s=device name  %c=active partition    %-30.30s=part type          %7Ld=size"

现在我想显示相同的分区表,但稍作修改,以便分区槽中的间隙将按范围显示,如:

5-119     /dev/sda5.../dev/sda119    Empty          0

我使用格式化的字符串:

%d-%-6d=partition range   %s%d...%s%d=(/dev/sda5.../dev/sda119)   %c  %-30.30s  %7Ld

但它对我没有帮助。

正确的格式字符串应该是什么?谁能帮帮我吗? P.S:我正在使用gcc编译器

1 个答案:

答案 0 :(得分:1)

我认为您需要使用snprintf()来准备两个复合字符串,然后使用更简单的printf()来进行实际打印。既然你没有展示你的实际代码,我们必须猜测一切,这是一件令人讨厌的事情......

int   min = 5;
int   max = 119;
char *dev = "/dev/sda";

char  num_range[32];
char  dev_range[60];

snprintf(num_range, sizeof(num_range), "%d-%d", min, max);
snprintf(dev_range, sizeof(dev_range), "%s%d...%s%d", dev, min, dev, max);

printf("%-10s   %-50.50s   %c%-30.30s  %7d", num_range, dev_range, ' ', "Empty", 0);

您为单个设备指定了%-25.25s,因此不清楚是否应该为该范围加倍,或者您应该使用其他值(甚至是相同的值);你需要调整那部分格式字符串以适合自己。这种技术也是我在名称末尾得到冒号的方法 - 将名称和冒号格式化为字符串,然后将该字符串格式化为最终的打印操作。