2016-11-12 65 views
-2

這是我獲取學生詳細信息的代碼。分割故障核心(轉儲)

#include <stdio.h> 

struct det{ 
    char fname[25], lname[25], shift[10], sec[2]; 
    int roll, clss, id; 
}; 

int details(); 

int main(){ 
    details(); 

    getchar(); 
    getchar(); 

    return 0; 
} 

int details(){ 
    char rl; 
    FILE *fp; 
    struct det n; 

    printf ("\n Enter Student Informations Below : \n\n"); 

    printf (" First Name : "); 
    scanf ("%s",&n.fname); 

    printf (" Last Name : "); 
    scanf ("%s",&n.lname); 

    printf (" Roll : "); 
    scanf ("%d",&n.roll); 

    rl = (char) n.roll + ".txt"; 

    fp = fopen(rl, "w"); 

    printf (" ID : "); 
    scanf ("%d",&n.id); 

    printf (" Class : "); 
    scanf ("%d",&n.clss); 

    printf (" Shift : "); 
    scanf ("%s",&n.shift); 

    printf (" Section : "); 
    scanf ("%s",&n.sec); 

    // Works fine till here. Shows in console that segmentation fault, core dumped. 

    fprintf (fp, "\n Name : %s %s\n", n.fname, n.lname); 
    fprintf (fp, " Class : %d\n Roll : %d\n ID : %d\n", n.clss, n.roll, n.id); 
    fprintf (fp, " Section : %s\n Shift : %s\n", n.sec, n.shift); 

    fclose(fp); 

    printf ("\n\n Details Stored.\n\n Press Enter To Exit..."); 

    return 0; 
} 

工作正常,直到標記的行。但是,然後我在控制檯'Segmentation fault'上看到這條消息。核心(甩)。有人可以告訴我代碼中出現了什麼問題,以及如何解決它?

+0

你是否通過調試器運行你的代碼?或者像valgrind之類的東西? – Evert

+0

你看過任何編譯器警告嗎?確保把它們全部打開,如果你不確定它們,不要忽略它們。 – Evert

+0

至少格式化您的代碼。更好的辦法是嘗試去理解程序出錯的地方(通過使用調試器或插入調試語句),並在問題中包括這種調查的結果。 – davmac

回答

1

問題#1

char fname[25]; 
scanf ("%s",&n.fname); 

正如所解釋的elsewhere,這似乎工作,但它是錯誤的。使用scanf("%s", fname);

問題#2

rl = (char) n.roll + ".txt"; 

此語句不連接字符串,你大概的意思做; C中的二進制+運算符不能像那樣工作。發生了什麼這裏:

  • ".txt"是類型「指針char」的表達,它指向該序列(C11 6.3.2.1p3
  • (char) n.roll的第一元件投射的int到較窄整數類型, char,從而丟棄一些信息。如果需要char,使用char,否則記錄其目的
  • (char) n.roll是整數類型的,因此,如果它的值N是在範圍[0,4],其結果是類型「指針char」和點到陣列對象的第n個元素,否則行爲是未定義 (C11 6.5.6p8
  • 結果被分配給rl,這是char類型的,這意味着你正在努力的指針分配給一個整數(和應該看到一個警告,說明確實如此)

如果你想安全地創建一個字符串,其中包含表「NNN.txt」,您使用字符串格式化功能,如snprintf的字符串:

char buffer[MAXIMUM_FILENAME_SIZE]; 
snprintf (buffer, sizeof buffer, "%d.txt", n.roll); 

然後檢查錯誤,並適當地處理它們。