2017-12-17 19 views
-1

このコードでは、struct Studentの配列を受け入れてポインタを使用して表示します。 コードはあまり一般的ではありません。共通のアプローチは、このコード自体の中に1行のコメントで示されています。「ポインタを使用して構造体の配列にアクセスする」

ただし、「パーセント」の正しい値が表示されないため、このアプローチでは問題があるようです。誰がこの問題の原因が何であるか教えてもらえますか?

#include<stdio.h> 

struct Student 
{ 
    char grade; 
    int rollNumber; 
    float percentage; 
}; 

typedef struct Student Student; 

void acceptArray(Student*); 
void displayArray(Student*); 

int main() 
{ 
    Student myFriends[3]; 
    Student* p = myFriends; 

    acceptArray(p); 
    displayArray(p); 
} 

void acceptArray(Student* p) 
{ 
    int i = 0; 
    for(i = 0; i < 3; i++) 
    { 
     printf("\nEnter grade, roll number, and percentage:\n"); 
     scanf(" %c %d %f", 
       (p + i), 
       //&(p + i)->grade 
       //&p[i].grade 
       ((Student*)((unsigned int)p + sizeof(char)) + i), 
       //&(p + i)->rollNumber 
       //&p[i].rollNumber 
       ((Student*)((unsigned int)p + sizeof(char) + sizeof(int)) + i) 
       //&(p + i)->percentage 
       //&p[i].percentage 
       ); 
    } 
} 

void displayArray(Student* p) 
{ 
    int i = 0; 
    for(i = 0; i < 3; i++) 
    { 
     printf("\nGrade is  : %c.", *(p + i)); 
       //(p + i)->grade 
       //p[i].grade 
     printf("\nRoll number is: %d.", *((Student*)((unsigned int)p + sizeof(char)) + i)); 
       //(p + i)->rollNumber 
       //p[i].rollNumber 
     printf("\nPercentage is : %.1f.", *((Student*)((unsigned int)p + sizeof(char) + sizeof(int)) + i)); 
       //(p + i)->percentage 
       //p[i].percentage 
    } 
} 
+0

@ sg7 - Huh? 'p'は' myFriends'の最初の要素を指すように初期化されます。 –

+0

@ sg7 typedefは、struct StudentをStudentに置き換えるために使用されます。 –

+0

これは不明です。従来の '&p [i] .grade'などを使用するとどうなりますか? (最小限のテストケース(https://stackoverflow.com/help/mcve)を構築できますか?) –

答えて

0

。あなたのやり方は間違っています。それは正しいものではないでしょう(Cのリファレンスマニュアルの抜粋)。必要に応じて

孔又はパディングは、メモリ内のコンポーネントの適切な位置合わせを可能にする に構造のレイアウトの最後の構成要素の後に任意の2つの連続成分又は 間に現れ得ます。そのような穴に現れるビットパターン は予測不可能であり、 構造と構造が異なるか、時間がたつと1つの構造内で異なる場合があります。

私たちが普通にやっている方法では、構造体の読みやすさと可読性がずっと簡単だと言われています(&p[i].grade ..)。シンプルなことを簡単に保つ。

0

ポインタを正しく使用していません。最良の方法は、[i]でインデックスを作成し、.演算子を介して構造体メンバーにアクセスすることです。

こうすれば、よりクリーンなコードが得られます。あなたがそれを行う方法は、構造の中に入ると、穴を埋めるためにお勧めしません。

#include<stdio.h> 

struct Student 
{ 
    char grade; 
    int rollNumber; 
    float percentage; 
}; 

typedef struct Student Student; 

void acceptArray(Student*); 
void displayArray(Student*); 

int main() 
{ 
    Student myFriends[3]; 
    Student* p = myFriends; 

    acceptArray(p); 
    displayArray(p); 
} 

void acceptArray(Student* p) 
{ 
    int i = 0; 
    char c; 
    int d; 
    float f; 

    for(i = 0; i < 3; i++) 
    { 
     printf("\nEnter grade, roll number, and percentage:\n"); 
     scanf(" %c %d %f", &c, &d, &f); 

       p[i].grade = c; 
       p[i].rollNumber = d; 
       p[i].percentage = f; 
    } 
} 

void displayArray(Student* p) 
{ 
    int i = 0; 
    for(i = 0; i < 3; i++) 
    { 

     printf("\nGrade is  : %c.", p[i].grade); 
     printf("\nRoll number is: %d.", p[i].rollNumber); 
     printf("\nPercentage is : %.1f.", p[i].percentage); 
     } 
} 

OUTPUT:あなたはscanfに構造体オブジェクトの個々のコンポーネントのアドレスを渡すためにしようとしている

Enter grade, roll number, and percentage:                                                   
A 1 66.8                                                           

Enter grade, roll number, and percentage:                                                   
B 2 77.8                                                           

Enter grade, roll number, and percentage:                                                   
C 3 88.9                                                           

Grade is  : A.                                                        
Roll number is: 1.                                                        
Percentage is : 66.8.                                                        
Grade is  : B.                                                        
Roll number is: 2.                                                        
Percentage is : 77.8.                                                        
Grade is  : C.                                                        
Roll number is: 3.                                                        
Percentage is : 88.9.                                                        
関連する問題