2012-10-31 62 views
1

我显示的分区表,该表显示有点像:在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编译器

+0

最后一种格式的输出是什么? – iabdalkader

回答

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,所以目前尚不清楚是否应该翻一番对于范围,或者你应该使用一些其他值(或甚至相同的值);你需要调整格式字符串的那一部分以适合自己。这种技术也是我如何在名称末尾得到冒号 - 将名称和冒号格式化为字符串,然后将该字符串格式化为最终的打印操作。

+0

早些时候,一个设备被一个字符串显示,像'/ dev/sda5'是一个字符串。但是现在dev的名字部分和分区部分是字符串和数字,因为我们正在计算差距。像/ dev/sda是​​一个字符串,5是一个数字。请让我知道你是否需要更多的澄清。 – kingsmasher1

+0

'dev_range'字符串以'/ dev/sda5 .../dev/sda119'(23个字符)结尾;唯一的问题是在最后的'printf()'中有多少空间可用。它应该是50(如现在的答案),还是25(如原来的)或其他值?它应该用'%-25s'打印,因此它占用至少那么多空间,但是如果名称更长('/ dev/rdsk/c1d0s2t0 .../dev/rdsk/c1d0s2t6'),那么它会分流另一个数据不会丢失任何信息(只是对齐)。最终,这是一个微不足道的细节,你可以改变以适应自己。关键是使用预先格式化的字符串。 –

+0

感谢您的帮助,与您建议的snprintf和调整原始和我格式化的字符串我对齐。原来我做了:'“%-8d%-27.25s%c%-32.30s%7Ld”'和我的分区范围显示:''%-7s%-25.50s%c%-30.30s%7Ld \ n“ '同时使用这两个给出一个对齐的输出:) – kingsmasher1