伊莉討論區

標題: C語言的問題 f flush() 函式 讓書本試題程式 達成目的 [打印本頁]

作者: cht1902316    時間: 2016-11-14 01:54 PM     標題: C語言的問題 f flush() 函式 讓書本試題程式 達成目的

看書 自學 遇到問題了  書本 沒把f flush()講得很詳細 也沒有 範例程式 只好 到伊莉 尋求大家的幫忙了 感謝
==============================以下有圖片=============================
作者: johnwanz    時間: 2016-11-15 08:28 AM

fflush(stdin)似乎不是標準用法, 不是每個編譯器都能有效. 只有fflush(stdout)是可以用的.
作者: cht1902316    時間: 2016-11-15 11:18 AM

johnwanz 發表於 2016-11-15 08:28 AM
fflush(stdin)似乎不是標準用法, 不是每個編譯器都能有效. 只有fflush(stdout)是可以用的. ...

感穴 你 感穴 感穴~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
作者: 炽天使    時間: 2017-6-3 04:45 PM

cht1902316 發表於 2016-11-15 11:18 AM
感穴 你 感穴 感穴~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

你的scanf("%s",&a);這樣才對"&"這個是很重要的
作者: chevylin0802    時間: 2017-6-4 10:04 AM

本帖最後由 chevylin0802 於 2017-6-4 10:24 AM 編輯
johnwanz 發表於 2016-11-15 08:28 AM
fflush(stdin)似乎不是標準用法, 不是每個編譯器都能有效. 只有fflush(stdout)是可以用的. ...
講法有誤
fflush()是被GNU定義的標準函式
不管裏面的參數是stdin, stdout, stderr或者是其他的FILE *fp
fflush()都肯定可以有效編譯
只是GNU的標準函式庫是基於UNIX like的系統而發展出來的函式庫
所以在微軟的作業系統環境下未必能夠正常工作
比如setuid(), setgid(), getuid(), getgid()之類的函式
即使編譯連結正常
也照樣無法在微軟環境下工作(Windows/DOS都一樣)
接下來談有效編譯跟執行時期是否有動作的問題
fflush(stdin) 在Unix like系統裏是屬於未定義的行為
但是在微軟平台上如果使用Visual C++卻是可用的


作者: 炽天使    時間: 2017-6-5 08:23 PM

chevylin0802 發表於 2017-6-4 10:04 AM
講法有誤
fflush()是被GNU定義的標準函式
不管裏面的參數是stdin, stdout, stderr或者是其他的FILE *fp

有些不一定要用到fflush(stdin)來store文字如果用scanf來store一個字也行。
作者: chevylin0802    時間: 2017-6-5 09:19 PM

本帖最後由 chevylin0802 於 2017-6-5 09:33 PM 編輯
熾天使 發表於 2017-6-5 08:23 PM
有些不一定要用到fflush(stdin)來store文字如果用scanf來store一個字也行。


這種用法基本上我不會去使用
包括fflush(stdin)也不是我喜歡的做法
讀單一個字元的方式
多數還是使用getchar
而不是去使用scanf

fflush這個函式
最主要的功能是強制輸出之後清除緩衝
比較常見的情況是Linux系統要將資料寫入檔案時,強制執行寫入動作。
原因是Linux的寫檔方式通常都不是即時寫入
而是暫存在記憶體的緩衝區裡
會這樣子做的原因是很多場合的檔案寫入
往往都只是每次數十或數百個字元
如果直接寫入會對硬碟很傷
所以都會等到緩衝區快滿的時候才真正寫入
但是有時候我們卻需要讓資料在第一時間就寫入
這時候就需要使用到fflush

作者: 炽天使    時間: 2017-6-6 12:11 PM

chevylin0802 發表於 2017-6-5 09:19 PM
這種用法基本上我不會去使用
包括fflush(stdin)也不是我喜歡的做法
讀單一個字元的方式

那你知道malloc 的用法嗎?我不是很清楚。。。能解釋嗎?我只知道malloc是為了留位置其它不知道了和過后要free()
作者: chevylin0802    時間: 2017-6-6 12:52 PM

本帖最後由 chevylin0802 於 2017-6-6 01:01 PM 編輯
熾天使 發表於 2017-6-6 12:11 PM
那你知道malloc 的用法嗎?我不是很清楚。。。能解釋嗎?我只知道malloc是為了留位置其它不知道了和過后 ...

malloc就是所謂的記憶體配置
如果在早期的DOS
那麼傳回來的位址是真正實體記億體的位址
但是在多工作業系統以後
指的就是Windows, Linux 或 Unix like系統, Mac OS(含IOS)
傳回來的位址則是虛擬記憶體位址
虛擬記憶體位址在作業系統核心裏會有一份與實體位址的對應表
但是對C語言來說
malloc回傳的值則稱之為指標

malloc裏的參數是以byte為單位計算的大小
不過由於有所謂的位元對齊的關係
以32位元作業系統為例則是以4bytes作為最小單位
即使你只需要配置1個byte的記憶體
32位元的作業系統仍然會配給你4個byte
被配置給程式所使用的記憶體
就不會給其他程式使用
直到記憶體被釋出為止
而C的記憶體釋出的方法
則是使用free()函式來釋放

至於C++則提供了new跟delete兩個關鍵字

不過記憶體配置這個函式
有些單晶片並不支援
尤其是一些早期的單晶片並沒有MMU

至於為何需要記憶體配置?
原因是因為有時候我們並不知道要處理的資料長度究竟有多少
因此無法在程式裏直接註明
它不像我們對陣列採取指定大小的宣告方式一樣的明確
而在這個情況之下
就有必要採用動態配置記憶體的方式進行
而malloc就是當程式已經明確知道所要使用的記憶體容量大小的時候
就向作業系統要一塊足夠容納資料的記憶體空間
但是同樣的
當我們已經不需要使用的時候
當然需要把這塊記憶體空間歸還給作業系統

不過人終究不可能不出錯
尤其是程式寫得很龐大的時候
往往很容易出現記憶體被配置了卻忘了歸還的情況


作者: 炽天使    時間: 2017-6-6 03:00 PM

chevylin0802 發表於 2017-6-6 12:52 PM
malloc就是所謂的記憶體配置
如果在早期的DOS
那麼傳回來的位址是真正實體記億體的位址

malloc一定是要用pointer來指定*ptr?如何使用的?
作者: 炽天使    時間: 2017-6-6 03:03 PM

是像array的用法嗎?如果我要用malloc要如何使用?
作者: chevylin0802    時間: 2017-6-6 04:11 PM

本帖最後由 chevylin0802 於 2017-6-6 04:17 PM 編輯
熾天使 發表於 2017-6-6 03:00 PM
malloc一定是要用pointer來指定*ptr?如何使用的?

是的, malloc傳回的是一個指標

比如:
char *p=(char*)malloc(sizeof(char)*10);
int data[] = (int*)malloc(sizeof(int)*20);
struct test *t = (struct test*)malloc(sizeof(struct test));

雖然動態配置記憶體很好用
不過像是一些需要記憶體當緩衝區的I/O
通常我們都是給定一個固定大小的字元陣列
這時候我們不會去進行記憶體配置
因為記憶體配置的傳回值有可能是NULL
也就是沒有配置成功的情況
雖然這種狀況非常罕見

所以比較有sense的程式設計師都會在malloc之後再進行一次檢查
檢查配置回來的記憶體是否回傳為NULL


作者: 炽天使    時間: 2017-6-6 05:20 PM

chevylin0802 發表於 2017-6-6 04:11 PM
是的, malloc傳回的是一個指標

比如:

是用來測試記憶体容量?看是不是null?所以是一種測試記憶体容量功能?
作者: chevylin0802    時間: 2017-6-6 05:50 PM

熾天使 發表於 2017-6-6 05:20 PM
是用來測試記憶体容量?看是不是null?所以是一種測試記憶体容量功能?

不是測試記憶體容量
請重新看清楚我講的內容
作者: o_g349    時間: 2017-9-14 01:41 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: Wesley28    時間: 2017-9-27 02:26 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: 神之風想    時間: 2018-5-5 09:41 AM

謝謝大大的分享喔,小弟覺得很好喔~解決了我的問題




歡迎光臨 伊莉討論區 (http://www43.eyny.com/) Powered by Discuz!