[精讚] [會員登入]
1255

【C】(%c, %d)解決讀取字元時的緩衝區殘留

“
不解決就會莫名其妙地冒出一些莫名其妙的東西
„

分享此文連結 //n.sfs.tw/15982

分享連結 【C】(%c, %d)解決讀取字元時的緩衝區殘留@小編過路君子
(文章歡迎轉載,務必尊重版權註明連結來源)
2022-11-16 21:28:17 最後編修
2022-11-16 18:32:27 By 過路君子
 

哈囉大家好,這裡是回歸初心的小編過路君子

從 C 開始學怎麼寫程式,卻已經快要兩年沒有寫任何一個 C 的程式碼......

 

 

在小編那時學 C 的時候程度還不夠,所以沒有要將讀取到的資料餵入陣列的問題,直到最近才突然要寫 C 且遇到這個問題。

所以首先就要來看看小編要讀取的資料格式:

5
X . . P .
. . . . .
P . . . .
. . . . .
. . . . P

第一行會輸入一個數字 n,表示接下來會輸入一個 n * n 的陣列。

而接下來的 n 列資料都是該陣列的資料,以空格和換行做區隔。

 

所以小編採用了以下的策略來讀取資料:

1. 先用scanf("%d", &n)讀取第一個 n 來獲得接下來有多少資料要讀。
2. 緊接著使用 for 迴圈搭配scanf("%c", &ch)來讀取所有的陣列資料。

相關程式碼如下:

#include<stdio.h>
#include<stdlib.h>


int main()
{
	int n;
	scanf("%d", &n);
	
	char **data = malloc(n * sizeof(char*));
	for(int x=0; n>x; x++) 
	{
		char *temp = malloc(sizeof(char));
		*(data + x) = malloc(n * sizeof(char));
		
		for(int y=0; n>y; y++)
		{
			scanf("%c", temp);
			*(*(data + x) + y) = *temp;
		}

		free(temp);
	}

	for(int x=0; n>x; x++) free(*(data+x));
	free(data);
	return 0;
}

結果陣列內的資料內容如下:

X .
. P .

. .
. . .

P .

疑似將換行和空白都當作一般字元來處理,並且丟到陣列裡面了。

 

後來查詢了相關的資料,C 中的 %c 並不會像 %d 一樣會自動忽略空格,空格會被當成一個字元來處理。

所以將第 18 行的 scanf 改成以下:scanf("%c ", temp);。

修改後再次讀取資料,結果陣列內的資料內容如下:


X..P
.....
.P...
.....
.....

看似正常了,其實不然。

首先,多了一個奇怪的換行且有一筆資料不見了,原因顯而易見。

 

這就讓小編很難辦了,第一個想到的問題是緩衝區還留著上次讀取數字時的 \n。

但是如果使用 getchar 嘗試去清空緩衝區,那當最後一筆資料進入之後,程式並不停止讀取資料。

要再多給一筆才會停止讀取,然後顯示出正常的結果。

 

結果就到處亂鑽,始終沒有找到好辦法來解決這個問題。

直到讀到了某篇文章提到空格和換行之類的對 scanf 是同樣的東西,小編才突然領悟,使否能使用這個特性來清除緩衝區並在正確的時間點停止?

心動不如法上行動,作法也很簡單,直接將第 18 行再改成如下:scanf(" %c", temp);。

 

再次啟動程式並未入資料,觀察陣列內的資料:

X..P.
.....
P....
.....
....P

完美!問題解決,花了一個小時就因為空格放錯地方。

 

 

 

後記

真的是好久沒有寫 C 了,難得回來寫一下,沒想到剛寫就踢到鐵板。

有必要玩這麼刺激嗎......

END

你可能感興趣的文章

【Wickct】(link) <a> 如何新增超連結 簡單來說有兩種方式,小編個人比較偏好 的方法

【PaperMC】從 Waterfall 切換至 Velocity waterfall 已經停止支援,最後停留在支援 Minecraft 1.21.6,之後的 Minecraft 版本便不再支援

【Discord bot】[botton]按鈕的使用、響應和關閉 Discord的botton通常都要和View配合使用。

【Python3】11 - 字典(Dictionary)的使用範例 python3的幾個字典使用範例,改寫自他人perl的範例

【Wildfly/jBoss】[Linux] 如何從無到有建立Wildfly網頁伺服器 包含一切所需的指令

【Firefox \ Maven】[Headless](Linux) 如何使用Maven打包並驅動Firefox 有時候我們需要取得渲染後的網頁,當然是直接呼叫瀏覽器出來用啦

隨機好文

高捷少女:小穹與果仁巧克力㊥ 艾咪臉上泛起笑容說:「妳知道嗎?就跟花語一樣,每一種巧克力也都有各自的涵義:薄荷巧克力代表初戀;卡通巧克力代表天真爛漫;而果仁巧克力代表的是窩心,還有想陪伴對方的心情,這在德國是女生之間在慶生時會彼此

高捷少女:地下城的探險少女② 「等我一下喔,我好像有帶去漬的清潔噴霧。」婕兒翻翻飛揚,拿出噴霧劑給小穹,小穹趕緊對著汙漬噴了噴,紅茶漬果然乾淨了許多。「婕兒,謝謝妳。來,還妳。」小穹感謝地把噴霧還給她,卻發現婕兒盯著打開的飛揚,一

高捷少女:美麗島的守護者⑤  雖然暫時不用怕牠們了,可是一直躲在這裡終究不是辦法,小雅心想。她看看四周,這間更衣室沒有窗戶或後門,她不禁著急起來,不可能一直躲在這裡面,但從門出去只會被群貓圍攻而已。小雅低下頭苦思該怎麼辦,過了不

高捷少女:美麗島的守護者⑥ 一陣貓叫傳到小雅耳中,原本要朝小雅撲過去的北風轉了個圈,從半空中落地,牠的表情宛如五雷轟頂。這聲音……難道是……

婕兒──她的青春① 「各位乘客,本列車即將抵達拉里奧哈自治區,並在此地停留三天兩夜,後天的中午十二點將搭乘班機返回臺灣,感謝各位乘客對本次旅程的配合。」火車上的廣播器朗誦道。「時間過得真快呢,這次的歐洲之旅就這樣結束了,