C程序如何以表格格式对齐打印

Posted

技术标签:

【中文标题】C程序如何以表格格式对齐打印【英文标题】:C program how to print in table format alignment 【发布时间】:2016-08-18 18:24:11 【问题描述】:

输入是从文本文件中检索的。其中包含

的信息 产品编号 产品名称 产品数量

产品价格

1    RAYBAN  1   450.000000 
900 KEYBOARD 100 290.000000
78 MINERALWATER 123 345.000000
2 RAYBAN 2 450.000000

通过命令提示符打印输出后。它与第一项不一致。如何使其与表格标题对齐。如您所见,第 1 行和第 4 行的输入几乎相同。

这是输出。

这是完整的代码。具有gotoxy 功能。显示功能开启

int displayProduct()

表格标题有一行代码,还有来自 TXT 文件的 printf。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <ctype.h>

void gotoxy(int column, int line);
int main();
int addProduct();
int displayProduct(); //prototype

struct product 
    int quantity, reorder, i, id;
    char name[20];
    float price;
;

COORD coord =  0, 0 ;

void gotoxy(int x, int y) 
    coord.X = x; coord.Y = y;

    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);


int main() 
    int choice;

    gotoxy(17, 5);
    printf("\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2 SYZ INVENTORY PROGRAM \xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2");

    gotoxy(17, 20);
        printf("\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2");

    gotoxy(22, 8);
    printf("1. Add Product\n\n");

    gotoxy(22, 10);
    printf("2. Display Product\n\n");

    gotoxy(22, 12);
    printf("3. Search Product\n\n");

    gotoxy(22, 14);
    printf("4. Reorder Level of Product\n\n");

    gotoxy(22, 16);
    printf("5. Update Product\n\n");

    gotoxy(22, 18);
    printf("6. Exit\n\n");

    gotoxy(22, 22);
    printf("Please Enter Your Choice : ");
    scanf(" %d", &choice);

    switch (choice) 
      case 1:
        addProduct();
        break;
      case 2:
        displayProduct();
        break;
      case 3:
        searchProduct();
        break;
      case 4:
        reorderProduct();
        break;
      case 5:
        updateProduct();
        break;
      case 6:
        break;
      default:
        system("cls");
        main();
    
    return (0);


/*MENU CODE ENDS !*/

int addProduct() 
    FILE *fp;

    int i = 0;
    struct product a;
    system("cls");

    fp = fopen("inventory.txt", "a+t");

    char checker;

    do 
        system("cls");

        gotoxy(17, 5);
        printf("\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2 SYZ INVENTORY PROGRAM \xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2");

        gotoxy(17, 20);
        printf("\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2");

        gotoxy(22, 8);
        printf("Enter product ID : ");
        scanf(" %d", &a.id);

        gotoxy(22, 10);
        printf("Enter product name : ");
        scanf(" %s", a.name);

        gotoxy(22, 12);
        printf("Enter product quantity : ");
        scanf(" %d", &a.quantity);

        gotoxy(22, 14);
        printf("Enter product price : ");
        scanf(" %f", &a.price);

        gotoxy(22, 17);
        fprintf(fp, "%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price); //SAVE TO TXT FILE LINE !
        printf("Record saved!\n\n");

        fclose(fp);

        gotoxy(22, 22);
        printf("Do you want to enter new product? Y / N : ");

        scanf(" %c", &checker);
        checker = toupper(checker);

        i++;

        system("cls");
     while (checker=='Y');

    if (checker == 'N') 
        main();
     else 
        do 
            system("cls");

            gotoxy(17, 5);
            printf("\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2 SYZ INVENTORY PROGRAM \xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2");

            gotoxy(17, 20);
            printf("\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2");

            gotoxy(18, 8);
            printf(">>> Wrong Input! Please Enter Y Or N Only! <<<");

            gotoxy(19, 12);
            printf("Do You Want To Enter New Product? Y / N : ");
            scanf(" %c", &checker);
            checker = toupper(checker);
         while (checker != 'Y' && checker != 'N');

        if (checker == 'Y')
            addProduct();
        

        if (checker == 'N') 
            system("cls");
            main();
        
    
    return(0);


/*ADD PRODUCT LINE ENDS !*/

int displayProduct() 
    FILE *fp;
    struct product a;

    char true;
    system("cls");

    fp = fopen("inventory.txt", "r");

    gotoxy(17, 5);
    printf("\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2 SYZ INVENTORY PROGRAM \xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2");

    gotoxy(5, 6);
    printf("======================================================================");

    gotoxy(5, 7);
    printf("Product ID\t\t Product Name\t\t Quantity\t Unit Price\n"); //TABLE TITLES !

    gotoxy(5, 8);
    printf("======================================================================");

    gotoxy(5,10);
    while (fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price) == 4) 
        printf("%d\t\t\t %s\t\t\t %d\t\t %.2f\n\n", a.id, a.name, a.quantity, a.price); //PRINT FROM TXT FILE TO COMMAND PROMPT.
    
    fclose(fp);

    printf("\t\t \xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2\xB2");

    printf("\nPress any key to return to Main Menu.");

    getch();

    int main();

    return (0);

更新了一个,进行了更改:

gotoxy(5,10);
                while(fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price)==4)
                
                printf("%-10d\t\t %-12s\t\t %8d\t %8.2f\n\n", a.id, a.name, a.quantity, a.price);
                

                fclose(fp);

【问题讨论】:

如果您需要在控制台中格式化掩码,请使用类似 ncurses 的屏幕库。 gotoxy-only 格式已经过时且容易出错。 【参考方案1】:

打印库存的代码应使用printf 格式的长度说明符,如下所示:

gotoxy(0, 10);
while (fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price) == 4) 
    printf("    %-10d\t\t %-12s\t\t %8d\t %8.2f\n\n", a.id, a.name, a.quantity, a.price);

关于代码的一些注释:

递归调用main() 是非常糟糕的风格。请改用循环。

编写一个打印标题的函数,而不是多次复制代码。

displayProduct() 末尾的语句int main(); 是函数main 的局部声明,它不会生成调用。

【讨论】:

谢谢。我还在学习。会即兴发挥:) 你能检查更新的命令提示符吗?看来,只有第一行。 问题来自循环前的gotoxy(5, 10);。只有第一行的缩进为5。我更新了答案来解决这个问题。 好吧,酷。设法解决它。我还有 1 个问题,-10, -12,8 是什么意思? @AlifKhair:% 后面的数字是转换的最小字段宽度。如果前面有-,则转换左对齐并用空格填充,否则它右对齐,前面有空格。例如:%-10d 将数字42 转换为字符42 。使用此功能,您可以根据需要格式化文本输出。【参考方案2】:

您的菜单在按任意键后不会返回主菜单, 在那里你必须使用 main();而是 ogf int main();

【讨论】:

以上是关于C程序如何以表格格式对齐打印的主要内容,如果未能解决你的问题,请参考以下文章

如何将格式正确的表格打印到控制台?

C#Winform程序,怎样实现这种表格

c++,怎么控制输出格式,使每一行格式相同,且对齐,就比如输出一个表格形式

“在列中对齐字段”C / C ++

C程序设计-格式控制符标准输入输出函数

Java输出结果怎么对齐