为什么大小为 2 的字符数组打印的字符超过 2 个?

0 c arrays allocation scanf char

为什么某些等级 (Hurup Mutu)列项目打印有标记 (Angka Mutu)列项目(例如B+3,5,其中B+是等级,3,5是标记),即使在我的 中data struct,我已经定义了等级 (Hurup Mutu) Mutu) char 数组只有 2 个字符,但最多可存储 5 个字符。

这并不是每行都会发生,所以我很难找到错误,请帮助我。

您可以在以下输出中看到它,我突出显示了错误的结果:

输出

这是我的 C 代码


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

struct data
{
    char nim[13];
    char nama[50];
    float uts, uas, tugas, kuis,total;
    char grade[2], angka[4], status[14];
};

void tampil();
void data(struct data[], int );
char* hurupMutu(int);
char* nilaiMutu(int);
char* status(int);

int main() {

    tampil();

    return 0;
}

void tampil(){
    int p;
    char *a;

    printf("+----------------------------------+\n");
    printf("|       Masukan Data Mahasiswa     +\n");
    printf("+----------------------------------+\n");

    printf("Masukan Banyak Data Mahasiswa : ");
    scanf("%d", &p);

    if (p < 1){
        printf("Data Mahasiswa harus lebih besar dari 0 ");
        exit(0);
    }

    struct data d[p];

    for(int i = 0; i < p; i++){
        int total = 0;
        
        printf("Data ke %d : \n", i+1);
        
        printf("Masukan NIM : ");
        fflush(stdin);
        gets(d[i].nim);
        
        printf("Masukan Nama : ");
        fflush(stdin);
        gets(d[i].nama);
        
        printf("Masukan Nilai UTS : ");
        scanf("%f", &d[i].uts);
        total +=  d[i].uts * 0.3;
    
        printf("Masukan Nilai UAS : ");
        scanf("%f", &d[i].uas);
        total += d[i].uas * 0.3;
        
        printf("Masukan Nilai Tugas : ");
        scanf("%f", &d[i].tugas);
        total += d[i].tugas * 0.2;
    
        printf("Masukan Nilai Kuis : ");
        scanf("%f", &d[i].kuis);
        total += d[i].kuis * 0.2;
        d[i].total = total;
      
        strcpy(d[i].grade, hurupMutu(d[i].total));
        strcpy(d[i].status, status(d[i].total));
        strcpy(d[i].angka, nilaiMutu(d[i].total));
    }
  
    data(d, p);
}

char* hurupMutu(int a){
    if (a >= 80 && a <= 100){
      return "A";
    }else if(a >= 70 && a < 80){
      return "B+";
    }
    else if(a >= 65 && a < 70){
      return "B";
    }else if(a >= 60 && a < 65){
      return "C+";
    }else if(a >= 55 && a < 60){
      return "C";
    }else if(a >= 50 && a < 55){
      return "D+";
    }else if(a >= 45 && a < 50){
      return "D";
    }else if( a < 45){
      return "E";
    }else{
      return "?";
    }
}



char* nilaiMutu(int a){
    if (a >= 80 && a <= 100){
      return "4,0";
    }else if(a >= 70 && a < 80){
      return "3,5";
    }else if(a >= 65 && a < 70){
      return "3,0";
    }else if(a >= 60 && a < 65){
      return "2,5";
    }else if(a >= 55 && a < 60){
      return "2,0";
    }else if(a >= 50 && a < 55){
      return "1,5";
    }else if(a >= 45 && a < 50){
      return "1,0";
    }else if( a < 45){
      return "0";
    }else{
      return "?";
    }
}

char* status(int a){
    if (a >= 80 && a <= 100){
      return "Istimewa";
    }else if(a >= 70 && a < 80){
      return "Sangat Baik";
    }
    else if(a >= 65 && a < 70){
      return "Baik";
    }else if(a >= 60 && a < 65){
      return "Cukup Baik";
    }else if(a >= 55 && a < 60){
      return "Cukup";
    }else if(a >= 50 && a < 55){
      return "Kurang Cukup";
    }else if(a >= 45 && a < 50){
      return "Kurang";
    }else if( a < 45){
      return "Sangat Kurang";
    }else{
      return "Tidak Tau";
    }
}


void data(struct data d[], int p){

    printf("+------------------------------------------------------------------------------------------+\n");
    printf("| NO |    NIM     |     Nama  | Total Nilai | Hurup Mutu | Angka Mutu | Gabungan Kemampuan |\n");
    printf("+------------------------------------------------------------------------------------------+\n");
    for(int i = 0; i < p; i++){
        printf("| %d  ", i + 1);
        
        int a = strlen(d[i].nim);
        int b = 10 - a;
        
        printf("| %s ", d[i].nim);
        for(int j = 0; j < b; j ++){
            printf(" ");
        }
    
        int c = strlen(d[i].nama);
        int e = 50 - c;
    
        printf("| %s", d[i].nama);
        
        for(int j = 0; j < e; j ++){
            printf(" ");
        }
    
        printf(" |");
        printf(" %.2f       " ,d[i].total);

        int f = strlen(d[i].grade);
        int g = 12 - f;
    
        printf("| %s" ,d[i].grade);
        
        for(int j = 0; j < g; j++){
            printf(" ");
        }

        int h = strlen(d[i].angka);
        int k = 12 - h;
    
        printf("| %s" ,d[i].angka);
    
        for(int j = 0; j < k; j ++){
            printf(" ");
        }

        int l = strlen(d[i].status);
        int m = 20 - l;
    
        printf("| %s" ,d[i].status);
    
        for(int j = 0; j < m; j ++){
            printf(" ");
        }
    
        printf("|\n");
        printf("+------------------------------------------------------------------------------------+\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*CAT 6

char grade[2]太短,无法存储 2 个字符的字符串,"B+"因为没有空间容纳终止空字符。

分配足够的空间以避免错误。