首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否对齐控制台显示的printf()列并防止溢出到下一行?

是否对齐控制台显示的printf()列并防止溢出到下一行?
EN

Stack Overflow用户
提问于 2020-12-01 21:27:13
回答 1查看 73关注 0票数 1
代码语言:javascript
运行
复制
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);
}

See the output

我希望以这样一种方式对齐表:数据位于它们各自的列中,但表列不会停留在一行中。

我如何纠正这个问题?

EN

回答 1

Stack Overflow用户

发布于 2020-12-01 22:22:07

制表符确实有其位置,但对于将可变长度的数据项对齐为固定宽度的列来说,它们过于严格。printf() - sprintf()格式填充、宽度说明符、左对齐和右对齐技术对于您想要做的事情都很有用。在底部有一个参考链接,描述了这些方法和其他方法的详细信息。

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

  • 可用的总字段宽度(所有列共享的宽度)
  • 每个列允许的最大字段宽度应确保要写入列的数据不超过其列的宽度(截断字符串,在数字中使用较少的有效数字等)
  • 在格式说明符中使用灵活的格式化技术,如填充、对齐等,以满足预期的数据宽度要求。(请参阅下面的示例。)

下面的代码提供了几个使用这些技术的示例:

代码语言:javascript
运行
复制
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

假设参数如下:

代码语言:javascript
运行
复制
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} };

...Following是您的代码,修改后仅使用其中一种技术:

代码语言:javascript
运行
复制
    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", 
   printf("|%10d|%3d|%3d|%3d|%3d|%3d|%3d|%15s|%3d|%3d|%3d|%d|\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);
    }

以上输出:

Here is a resource,详细介绍了这些和许多其他格式化技术。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65091366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档