关于#格式控制#的问题,如何解决?

假设有n位同学m门功课的成绩如下,编一程序计算每位同学的总分以及各门功课的平均分。

img

第一行2个正整数,学生人数n和课程门数m。1 \leq n \leq 100 , 1 \leq m \leq 101≤n≤100,1≤m≤10,接下来有n行,每行一个学生的数据,依次是姓名和m门课程的成绩,姓名长度不超过8,课程成绩在0到150之间。
按照样例要求输出数据。姓名按照%-8s的格式输出,每门课程成绩按照%6d的格式输出,平均分按照%6.1f的格式控制输出。
样例:
5 4
张大明 120 142 120 256
李小红 110 107 106 280
王志强 108 100 127 290
王慧颖 115 138 119 270
李丹丹 134 129 115 284

为什么我最终输出的名字会这样呢?

img

//输入名字
for(i=0,j=4;i"%s",a[i]);  //a[i][j]是储存名字的 
              for(j=0;j"%d",&b[i][j]);
          a[i][j]='\0';
      }

//输出名字
    for(i=0;i"%-8s",a[i]);
         printf("%6d",c[i]);
        for(j=0;j"%6d",b[i][j]);
        }
        printf("\n");

因为第7行代码 a[i][j]='\0'; 这里把获取的每个学生名字字符串里的第j个下标位置添加了一个空字符,把姓名截断了,因为第4行已经获取了学生姓名,因此去掉此行即可,测试代码如下:

#include <stdio.h> 
#define N 100
#define M 20

int main(void){
    
    int n,m;
    scanf("%d%d",&n,&m);
    
    char a[N][20];
    int c[M];
    int b[N][M];
    
    int i,j;
    
    //输入名字
    for(i=0;i<n;i++)
      {
          scanf("%s",a[i]);  //a[i][j]是储存名字的 
          c[i]= 0;
          for(j=0;j<m;j++){
               scanf("%d",&b[i][j]);
               c[i]+=b[i][j]; //求每个学生的总分 
          }              
      }
      
      double avg[M];
      // 求每门功课的平均分 
      for(j=0;j<m;j++){
              avg[j]=0;
              for(i=0;i<n;i++){
                  avg[j]+=b[i][j];    
            }
            avg[j]/=n*1.0;
          
      }
 
//输出名字
    for(i=0;i<n;i++)
    {
         printf("%-8s",a[i]);
         printf("%6d",c[i]);
        for(j=0;j<m;j++)
        {
           printf("%6d",b[i][j]);
        }
        printf("\n");
     }
     
     // 打印每门功课的平均分 
     printf("%-8s%6s","平均分"," ");     
     for(i=0;i<m;i++){
         printf("%6.1f",avg[i]);
     }
      
     
     
    return 0;    
} 

img

a数组长度是多少啊?
printf("%-8s",a[i]); 改为
printf("%-12s",a[i]); 看看

供参考:

#include <stdio.h>
#define N 50
#define M 10
int main()
{
    int score[N][M] = { 0 }, i, j, n, m;
    char name[N][9] = { 0 };
    float ave[M] = { 0 };
    scanf("%d%d", &n, &m);
    for (i = 0; i < n; i++)
    {
        scanf("%s", name[i]);
        for (j = 0; j < m; j++)
        {
            scanf("%d", &score[i][j]);
            ave[j] += score[i][j];
        }
    }
    for (i = 0; i < n; i++)
    {
        if (i)  printf("\n");
        printf("%-8s", name[i]);
        for (j = 0; j < m ; j++)
            printf("%6d", score[i][j]);
    }
    printf("\naverage:");
    for (j = 0; j < m; j++)
    {
        ave[j] /= n;
        printf("%6.1f", ave[j]);
    }
    return 0;
}