2016-11-28 75 views
0

我在下面寫了使用指針讀取/打印結構的代碼。該應用程序正在打印數據,但後來崩潰。似乎是某處愚蠢的錯誤。無法找到確切的問題。我試着在printStruct中使用按值傳遞,並在readStruct中返回結構。沒有問題。當我使用指針時不確定發生了什麼問題。使用指針打印結構時的應用程序崩潰

所有的
#include<stdio.h> 
#include <inttypes.h> 
#include <string.h> 

struct student{ 
    char USN[10]; 
    char name[50]; 
    char gender; 
    uint8_t age; 
}; 


void printStruct (struct student*); 
void readStruct(struct student*); 


int main() { 

    uint8_t numStudents; 
    printf("Enter number of students\n"); 
    scanf("%d",&numStudents); 
    struct student firstSemStudent[numStudents]; 
    readStruct(firstSemStudent+0); 
    printStruct(firstSemStudent+0); 
    return 0; 
} 

void printStruct (struct student *var1) 
{ 
    printf("USN= %s\n",var1->USN); 
    printf("Name = %s\n",var1->name); 
    printf("Age = %d\n",var1->age); 
    printf("Gender = %c\n",var1->gender); 
} 

void readStruct(struct student *temp) 
{ 
    printf("\nEnter USN: "); 
    fflush(stdin); 
    gets(temp->USN); 
    printf("\nEnter Name: "); 
    fflush(stdin); 
    gets(temp->name); 
    printf("\nEnter age\n"); 
    scanf("%d",&temp->age); 
    printf("\nEnter the Gender as M/F"); 
    fflush(stdin); 
    scanf("%c",&temp->gender); 
} 

回答

1

首先,uint8_t *不是%d格式說明符scanf()有效的參數類型。使用錯誤類型的參數調用undefined behavior

之後,從技術上講,fflush(stdin);是再次,未定義的行爲,don't do it

第三,DO NOT use gets(), it is dangerous由於緩衝區溢出容易的可能性。改爲使用fgets()

修復所有問題(或者說,編譯器尖叫抱怨的警告消息),然後運行代碼。

+0

糾正除fflush()以外的問題後,它工作。但我的問題是:爲什麼有一個gets()和fflush()如果他們不工作?人們如何知道這些問題?如果我們不使用fflush,Scanf也會帶來麻煩。我真的很困惑這是從標準輸入讀取的最佳方式?另外我怎樣才能讀取uint8_t的數據?假設我不想去int或者short int。 – Rajesh

+0

@Rajesh最好的工作方式是使用'fgets()',恕我直言。在您方便的時候閱讀並解析。 –

+0

無符號字符的格式說明符怎麼樣?我不認爲它在那裏。我們如何在不使用%c的情況下讀取8位值?另外我讀了uint8_t,uint16_t等地方是聲明變量的標準方式,因爲它們獨立於架構。任何意見! – Rajesh