c語言 做乙個學生資訊管理程式遇到的問題總結

2021-10-06 16:34:25 字數 3462 閱讀 3816

1.檔案原有資訊覆蓋問題(可以直接看2.檔案獲取資料錯亂或無法獲取檔案資料 和 3.程式異常終止)

檔案讀寫模式:引自菜鳥教程

主要注意 r+,w+的區別

以w+方式開啟,原檔案內容一開啟就被刪除

2.儲存到檔案或者從檔案中獲取的資料錯亂,或者沒有獲得資料

原因:

1.儲存該資料的變數本身就沒有獲取到資料,不然就是輸出語句錯了,改下輸出語句就好了。

解決方法:

①利用scanf和fscanf的返回值來判斷是否成功讀取資料

例如:

if

(scanf

("%d %d %s"

,&i,

&n,s)==3

)//換為fscanf同理

else

從以上**可得到,一直輸入資料直到輸入正確為止的**

fflush()在標頭檔案#include

while

(scanf

("%d %s %c"

,&data.snum, data.name,

&data.***,)!=

3)//資料輸入異常處理

//資料輸入異常處理

如果資料獲取或者輸入錯誤原因(解決方法)如下:

①.從檔案中獲取的資料格式或者鍵盤輸入資料的格式和fscanf()/scanf()中 「」 內格式不同:

例如中英文空格不同,%s不讀空格,%c什麼都讀(盡量不用%c,建議換成%s等,%c會讀取到上次輸入輸出的回車或其他符號,和緩衝區的符號,而導致其他資料讀入出錯),並且記住檔案掃瞄資料時,檔案指標會向後移動。

②.你沒有成功開啟該檔案:

在呼叫獲取檔案資料的函式前,這個檔案已經被上部分**開啟了,並且還沒關閉,所以呼叫的函式不能再開啟檔案,也就獲取不到資料。

建議對使用的檔案,即用即關,別放到最後再關

2.fopen函式內的寫入檔案路徑錯誤,如果文件中的程式**的.cpp檔案,沒有和要開啟檔案在乙個磁碟內,就要把絕對路徑寫出來,如果在乙個磁碟內,寫相對路徑就可以了。

關於列印到檔案的中文出現亂碼,解決方法csdn上其他人部落格有講。

3.除錯程式時程式異常終止,或者一直卡在某個模組不動

尋找bug區域的個人方法

當程式異常,且沒有錯誤提示。那你就要自己對可能錯誤的地方進行分析,對**可能出錯區域寫上幾個printf看看哪個printf沒有輸出,問題就在哪,重複幾次縮小範圍就能找到程式卡住了的**區域,之後可以把**單獨建立乙個專案來測試。

個人遇到的錯誤一般有如下兩種可能

1。異常終止:

如果你使用了鍊錶,可能是鍊錶指向下乙個結點的位址沒有賦值為null或者已經申請到的空間的位址,如果沒有賦值,取得隨機值可能會指向不允許被訪問的記憶體區域,就會導致程式提前終止。

2.死迴圈

或者**對某種情況缺少考慮,最後乙個結點的next不為null,就會一直迴圈下去,

解決方法:

1,建議每次申請乙個記憶體就讓它的->next = null;你可能會覺得,我之後還有別的語句給他賦值,但那些語句賦值前你自己可能寫了條件的,萬一某種可能沒考慮到,沒賦值那不就涼了。

2,可能你的鍊錶遍歷函式,或者其它對鍊錶進行操作的函式如,插入、建立鍊錶等函式,不完善。看看**有沒有考慮到,空表、頭結點,尾結點,有你沒考慮到所有的可能的遍歷形式,或結點數量,導致遍歷一直進行,或者提前終止,可以單獨拿出這段**,做個函式測試。

下面是乙個從檔案中獲取資訊並用鍊錶儲存的函式,函式返回值為表頭位址。

裡面從first->next的結點才開始存檔案資料

node *

getfileinformation

(char filename)

if(fscanf

(f2,

"%d %s %c %d-%d-%d %d %d %d"

,&s -> data.snum, s -> data.name,

&s->data.***,

&s-> data.birthday.year,

&s -> data.birthday.month,

&s -> data.birthday.day,

&s -> data .score[0]

,&s -> data.score[1]

,&s -> data.score[2]

)==9)

//確定鍊錶是否獲取到正確的資料

else

//檔案格式錯誤提示

error++;}

}fclose

(f2)

;return first;

}

總結

編寫程式出錯很正常,很大原因是知識掌握的不透徹。

再加上,你寫個幾百行的**,不出錯才怪。

1.看到或學到乙個函式,或者知識,最好弄清它的各種用法,和其他用法,不要想當然的去用,不然很容易出錯,不懂就查就問,不要憑感覺,**要有嚴謹的邏輯,不然你錯了哪了都不知道。

2.在做**量比較多的題目,還是要分布除錯,確保每步都正確,(大佬那就另說了)不要以為這浪費時間,等你都寫完,結果出錯了從幾百行**裡找問題,那你要找多久?不更浪費時間。

3.**還是要經常打,尤其是剛學的,沒幾天就忘的差不多了,到時後做題不得卡死,難受的很。而且不常打**,一看到題目就想吐(本人感受)。還是實踐才能加深記憶,用多了,也就會了。

4.打**也挺枯燥的吧,你可以去校oj.(題庫),或者pta等學習平台刷刷題,你會發現ac的感覺,爽的一匹。學了一些,或者領悟到一些知識技巧,也可以寫在部落格裡,寫的過程也是梳理知識,考察自己的過程,有助於自己更好的掌握。

學生資訊管理系統(C語言)

include includetypedef struct s student student insert student last student head 不傳頭 student order student student head,int student list length 按學號小到大...

C語言實現乙個簡單學生資訊管理系統

學生資訊管理,宣告乙個結構體儲存資訊先。儲存學生資訊的結構體 typedef struct student student 然後呢,增,刪,查,改,顯示,分別封裝為五個函式。其中新增和刪除的部分,為了使資料長度隨函式內增加和刪除的操作改變,傳參時除了陣列指標,陣列的長度也使用指標型傳遞。增 新增學生...

《C 語言基礎》程式閱讀 學生資訊管理系統

返回 賀老師課程教學鏈結 閱讀程式 簡單c 學生資訊管理系統 找出其 現建構函式 友元函式 運算子過載 靜態數成員語法現象出現的位置,仔細體會其用法,在以後的設計中能夠靈活應用有關方法和技巧。include include using namespace std define max 100 cla...