首页 > 解决方案 > 如何在c中的一行中打印不同的数组?

问题描述

我想在一个新函数的一行中打印我所有的数组 [i],但是我的输出表中的所有内容都没有对齐。
我找不到问题出在哪里:

#include <stdio.h>
#include <stdlib.h>
void userInput();
void formOutput(int, char (*)[50], char (*)[10], int *);

void main()
{
   userInput();
}

void userInput()
{   int totalSubj;

    printf("\nHow many subject to be registered: ");
    scanf("%d",&totalSubj);

    char subjCode[totalSubj][10], subjName[totalSubj][50];
    int subjCred[totalSubj];

    for(int i=0;i<totalSubj;i++)
    {
        printf("\nSUBJECT CODE %d.: ",i+1);
        scanf("%s",&subjCode[i]);

        printf("SUBJECT NAME: ");
        fgets(subjName[i],50,stdin);

        printf("SUBJECT CREDIT: ");
        scanf("%d",&subjCred[i]);
    }

    formOutput(totalSubj, subjName, subjCode, subjCred);
}

void formOutput(int subjTotal, char nameSub[][50], char codeSub[][10], int credSub[])
{
    printf("Subject Name                  Subject Code          Credit\n");
    printf("------------------------------------------------------------------");

    for(int i=0;i<subjTotal;i++)
    {
        printf("\n%s  ",nameSub[i]);
        printf("%s\t\t",codeSub[i]);
        printf("%d",credSub[i]);
    }
}

这是输出。
表中的值都搞砸了,有些也是重复的,这不是我想要的:

How many subject to be registered: 3

SUBJECT CODE 1.: DCS1053
SUBJECT NAME: Programming Technique
SUBJECT CREDIT: 3

SUBJECT CODE 2.: DCS1062
SUBJECT NAME: Current Issues in ICT
SUBJECT CREDIT: 3

SUBJECT CODE 3.: DCS1083
SUBJECT NAME: Object Oriented Programming
SUBJECT CREDIT: 3
Subject Name                  Subject Code          Credit
------------------------------------------------------------------
Programming Technique
  DCS1053               3
Current Issues in ICT
  DCS1062               3
Object Oriented Programming
  DCS1083               3
Process returned 3 (0x3)   execution time : 53.708 s
Press any key to continue.

我希望我的输出看起来像这样:

Subject Name                Subject Code           Credit    
---------------------------------------------------------------  
Programming Technique       DCS1053                   3  
Current Issues in ICT       DCS1062                   3
Object Oriented Programming DCS1083                   3

标签: carraysstringfunctionmultidimensional-array

解决方案


该函数fgets()将换行符作为输入,并将换行符插入到变量中,你会得到灾难性的输出。

此代码可以帮助您解决问题(注释中添加了方便的解释):

#include <stdio.h>
#include <string.h>

// defining macros the maximum lengths of array as a constant    
#define SUB_NAME_MAX 50
#define SUB_CODE_MAX 10

// function signature
void formed_output(int, char [][SUB_NAME_MAX], char [][SUB_CODE_MAX], int[]);

int main(void) {
    int total;

    printf("How many subjects to be registered? ");
    scanf("%d", &total);

    char sub_code[total][SUB_CODE_MAX], sub_name[total][SUB_NAME_MAX];
    int sub_credit[total];

    for (int i = 0; i < total; i++) {
        printf("\nSUBJECT CODE %d.: ",i+1);
        scanf("%s", &sub_code[i]);

        printf("SUBJECT NAME: ");
        fseek(stdin, 0, SEEK_END); // to avoid skipping user input
        fgets(sub_name[i], SUB_NAME_MAX, stdin);

        char *pos;
        if ((pos=strchr(sub_name[i], '\n')) != NULL)
            *pos = '\0'; // this one is the trick which will help to
                         // remove newline of each 'sub_name' array

        printf("SUBJECT CREDIT: ");
        scanf("%d", &sub_credit[i]);
    }

    printf("\n"); // for good-looking purpose

    formed_output(total, sub_name, sub_code, sub_credit);

    return 0;
}

void formed_output(int total, char name[][SUB_NAME_MAX], char code[][SUB_CODE_MAX], int cred[]) {
    printf("Subject Name                       Subject Code          Credit\n");
    printf("---------------------------------------------------------------\n");

    for(int i = 0; i < total; i++) {
        printf("%-35s", name[i]); // left-justified for next 35 places
        printf("%-22s", code[i]); // left-justified for next 22 places
        printf("%d \n", cred[i]);
    }
}

样本输出:

How many subjects to be registered? 3 

SUBJECT CODE 1.: DCS1053
SUBJECT NAME: Programming Technique    
SUBJECT CREDIT: 3

SUBJECT CODE 2.: DCS1062
SUBJECT NAME: Current Issues in ICT
SUBJECT CREDIT: 3

SUBJECT CODE 3.: DCS1083
SUBJECT NAME: Object Oriented Programming
SUBJECT CREDIT: 3
Subject Name                       Subject Code          Credit
---------------------------------------------------------------
Programming Technique              DCS1053               3
Current Issues in ICT              DCS1062               3
Object Oriented Programming        DCS1083               3

推荐阅读