在控制台显示屏上对齐printf()列并防止溢出到下一行? printf(“| processid\t+threadid\t | refilling\t | drinking\t | thinking\t |” 等待\t|终止\t|p|type\t|required\t|consumered\t| 唤醒计数\t |周转时间\t\t+\n“; 对于(int i=0;i

在控制台显示屏上对齐printf()列并防止溢出到下一行? printf(“| processid\t+threadid\t | refilling\t | drinking\t | thinking\t |” 等待\t|终止\t|p|type\t|required\t|consumered\t| 唤醒计数\t |周转时间\t\t+\n“; 对于(int i=0;i,c,C,我希望以这样一种方式对齐表,即数据位于各自的列下,但表列不在一行中 如何更正此问题?选项卡确实有其位置,但它们太硬,无法用于将可变长度的数据项对齐到恒定宽度的列中。 printf()。底部有一个参考链接,描述了这些方法和其他方法的详细信息 在设计表格时要考虑的事项: 可用的总字段宽度是多少(所有列共享的宽度) 每列允许的最大字段宽度是多少 格式化应确保写入列的数据不超过其列的宽度(截断字符串,在数字中使用较少的有效数字等) 在格式说明符中使用灵活的格式设置技术,如填充、对齐等,以匹配预期的数据

我希望以这样一种方式对齐表,即数据位于各自的列下,但表列不在一行中


如何更正此问题?

选项卡确实有其位置,但它们太硬,无法用于将可变长度的数据项对齐到恒定宽度的列中。
printf()。底部有一个参考链接,描述了这些方法和其他方法的详细信息

在设计表格时要考虑的事项:

  • 可用的总字段宽度是多少(所有列共享的宽度)
  • 每列允许的最大字段宽度是多少
  • 格式化应确保写入列的数据不超过其列的宽度(截断字符串,在数字中使用较少的有效数字等)
  • 在格式说明符中使用灵活的格式设置技术,如填充、对齐等,以匹配预期的数据宽度要求。(参见下面的示例。)
以下代码提供了一些使用这些技术的示例:

printf("| processid\t+ threadid\t| refilling\t| drinking\t| thinking\t| 
        waiting\t| terminated\t| p_type\t| required\t| consumed\t| 
        wake_count\t| turnaround_time\t\t+\n");

for (int i = 0; i < size; i++)
{
    printf("|%d\t\t| %d\t\t| %d\t\t\t| %d\t\t\t| \
        %d\t\t\t| %d\t\t\t| %d\t\t\t\t|%s\t\t| \
        %d\t\t\t| %d\t\t| %d\t\t| %d\t\t|\n", 
            pcb[i].processid, pcb[i].threadid, 
            (pcb[i].t_state == 1)?1:0, 
            (pcb[i].t_state == 2)?1:0, 
            (pcb[i].t_state == 3)?1:0, 
            (pcb[i].t_state == 4)?1:0, 
            (pcb[i].t_state == 5)?1:0, 
            (pcb[i].p_type == Student)?"Student": "Bartender", 
            pcb[i].light_beer_required, 
            pcb[i].light_beer_consumed, 
            pcb[i].wake_count, 
            pcb[i].turnaround_time);
}
typedef enum {
    Student,
    Bartender
}enum_e;   

typedef struct {
    int processid;
    int threadid;
    int t_state;
    enum_e p_type;
    int light_beer_required;
    int light_beer_consumed;
    int wake_count;
    int turnaround_time;
} pcb_s;
    
pcb_s pcb[3] = { {1234, 3, 1, Student, 1, 1, 2, 12},
                 {2345, 2, 2, Bartender, 1, 1, 2, 12},
                 {3456, 1, 3, Student, 1, 1, 2, 12} };
考虑到以下参数假设:

printf("|%-10d|, |%10d|\n", 1, 2);//left and right justtification within field
int pad1 = 5;
int pad2 = 10;
printf("|%.*d|, |%.*d|\n", pad1, 1, pad2, 2);//"*", variable padding  within field  
printf("|%-15s|\n", "string");// - left justifies
printf("|%15s|\n", "another string");// - right justifies
char *pad = "          "; //10 spaces
printf("|%s%*s|\n", pad, -9, "string");//combination of padding and justification
…以下是您的代码,已修改为仅使用其中一种技术:

printf("| processid\t+ threadid\t| refilling\t| drinking\t| thinking\t| 
        waiting\t| terminated\t| p_type\t| required\t| consumed\t| 
        wake_count\t| turnaround_time\t\t+\n");

for (int i = 0; i < size; i++)
{
    printf("|%d\t\t| %d\t\t| %d\t\t\t| %d\t\t\t| \
        %d\t\t\t| %d\t\t\t| %d\t\t\t\t|%s\t\t| \
        %d\t\t\t| %d\t\t| %d\t\t| %d\t\t|\n", 
            pcb[i].processid, pcb[i].threadid, 
            (pcb[i].t_state == 1)?1:0, 
            (pcb[i].t_state == 2)?1:0, 
            (pcb[i].t_state == 3)?1:0, 
            (pcb[i].t_state == 4)?1:0, 
            (pcb[i].t_state == 5)?1:0, 
            (pcb[i].p_type == Student)?"Student": "Bartender", 
            pcb[i].light_beer_required, 
            pcb[i].light_beer_consumed, 
            pcb[i].wake_count, 
            pcb[i].turnaround_time);
}
typedef enum {
    Student,
    Bartender
}enum_e;   

typedef struct {
    int processid;
    int threadid;
    int t_state;
    enum_e p_type;
    int light_beer_required;
    int light_beer_consumed;
    int wake_count;
    int turnaround_time;
} pcb_s;
    
pcb_s pcb[3] = { {1234, 3, 1, Student, 1, 1, 2, 12},
                 {2345, 2, 2, Bartender, 1, 1, 2, 12},
                 {3456, 1, 3, Student, 1, 1, 2, 12} };
for(int i=0;i
以上的输出:


这将详细介绍这些和许多其他格式化技术。

另一种方法是生成一个具有100%宽度的表格的html文件,并在浏览器中查看该文件。在编写长语句(如您在问题中遇到的语句)时,该方法可能会对您有用。您可以使用命令行中的
实用程序进行后期处理程序未对齐的输出。@mbaitoff-说明在什么环境下
实用程序是可行的可能很有用。