簡體   English   中英

C數組指針結構檢索信息

[英]C array pointers struct retrieving the info

所以這是 QI 得到的:

編寫一個包含以下類型定義的程序:

  1. 包含以下成員的結構 Student:
    • 學生身份證
    • 等級類型(字符等級為 0,整數等級為 1)
    • 學生的成績(可以是字符級,例如“B”或整數級,例如 84)
  2. 包含以下成員的聯合 StuGrade:
    • 字符級
    • 中級

您的程序應該創建一個指向大小為 5 的結構 Student 的指針數組,並由用戶填充它。 然后它應該打印獲得 A 級成績的學生信息。

我很確定我的問題在最后一部分

預期的 :

Enter ID: 111
0 for char grade or 1 for int grade: 0
Enter a char grade: A
Enter ID: 112
0 for char grade or 1 for int grade: 0
Enter a char grade: C
Enter ID: 113
0 for char grade or 1 for int grade: 1
Enter an int grade: 84
Enter ID: 114
0 for char grade or 1 for int grade: 1
Enter an int grade: 99
Enter ID: 115
0 for char grade or 1 for int grade: 0
Enter a char grade: A
***Student(s) who take grade 'A' is/are***
ID: 111
Grade: A
ID: 114
Grade: 99
ID: 115
Grade: A

我的輸出:

Enter ID: 111
0 for char grade or 1 for int grade:0
Enter a char grade:A
Enter ID: 112
0 for char grade or 1 for int grade:0
Enter a char grade:C
Enter ID: 113
0 for char grade or 1 for int grade:1
Enter an int grade:84
Enter ID: 114
0 for char grade or 1 for int grade:1
Enter an int grade:99
Enter ID: 115
0 for char grade or 1 for int grade:0
Enter a char grade:A
***Student(s) who take grade 'A' is/are***
ID : 115
Grade: A
ID : 115
Grade: A
ID : 115
Grade: A
ID : 115
Grade: A
ID : 115
Grade: A

代碼:

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

struct StuGrade{

    int intGrade;
    char charGrade[1];

};

struct Student{

    char ID[20];
    char typeG[1];

    struct StuGrade Grade;

};

int main(){

    int i = 0;
    struct Student std[5] ;

    struct Student *ptr = NULL ;

    ptr = std ;


    for (i = 0; i < 5; i++) {

        printf("Enter ID: ");
        scanf("%s", ptr->ID);

        printf("0 for char grade or 1 for int grade:");
        scanf("%s", ptr->typeG);

        if(strcmp(ptr->typeG,"0") == 0){

            printf("Enter a char grade:");
            scanf("%s", ptr->Grade.charGrade);

        }else{

            printf("Enter an int grade:");
            scanf("%d", &ptr->Grade.intGrade);

        } 
    }

    i =0;   
    printf("***Student(s) who take grade 'A' is/are***");


    for (i = 0; i < 5; i++) {

        if(strcmp(ptr->Grade.charGrade,"A") == 0){

            printf("\nID : %s",ptr->ID);
            printf("\nGrade: %s",ptr->Grade.charGrade);

        }

        if(ptr->Grade.intGrade >= 90){  

            printf("\nID : %s",ptr->ID);
            printf("\nGrade: %d",ptr->Grade.intGrade);
        }

    }




    return 0;
}




for (i = 0; i < 5; i++) {

    if(strcmp(ptr->Grade.charGrade,"A") == 0){

        printf("\nID : %s",ptr->ID);
        printf("\nGrade: %s",ptr->Grade.charGrade);

    }

    if(ptr->Grade.intGrade >= 90){  

        printf("\nID : %s",ptr->ID);
        printf("\nGrade: %d",ptr->Grade.intGrade);
    }

}

說明說

創建指向結構 Student 的指針數組

struct Student std[5] ;

是一個結構數組,而不是一個指針數組。 指針數組如下所示:

struct Student* std[5] ;

然后你需要為每個Student結構分配內存。

for (i = 0; i < 5; i++) {
    std[i] = malloc(sizeof(*std[i]));
    ptr = std[i];
    ...
}

另一個問題是char charGrade[1]; 不夠大,無法與等級保持一致。 一個字符串需要一個額外的字符作為空終止符,因此需要聲明一個 1 個字符的字符串char charGrade[2]; . typeG (盡管我不確定您為什么首先為此使用字符串,但它看起來應該是int )。

完整更正的程序是:

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

struct StuGrade{
    int intGrade;
    char charGrade[2];
};

struct Student{
    char ID[20];
    char typeG[2];
    struct StuGrade Grade;
};

int main(){
    int i = 0;
    struct Student* std[5] ;

    for (i = 0; i < 5; i++) {
        std[i] = malloc(sizeof(*std[i]));
        ptr = std[i];
        printf("Enter ID: ");
        scanf("%s", ptr->ID);

        printf("0 for char grade or 1 for int grade:");
        scanf("%s", ptr->typeG);

        if(strcmp(ptr->typeG,"0") == 0){
            printf("Enter a char grade:");
            scanf("%s", ptr->Grade.charGrade);
        }else{
            printf("Enter an int grade:");
            scanf("%d", &ptr->Grade.intGrade);
        } 
    }

    i =0;   
    printf("***Student(s) who take grade 'A' is/are***");

    for (i = 0; i < 5; i++) {
        ptr = std[i];
        if(strcmp(ptr->Grade.charGrade,"A") == 0){
            printf("\nID : %s",ptr->ID);
            printf("\nGrade: %s",ptr->Grade.charGrade);
        }
        if(ptr->Grade.intGrade >= 90){  
            printf("\nID : %s",ptr->ID);
            printf("\nGrade: %d",ptr->Grade.intGrade);
        }
    }

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM