[精讚] [會員登入]
1007

【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

你可能感興趣的文章

【Python3】[Django] (Windows / Liunx) 如何從零開始創建一個網站 除了最基本的運作以外,還小小的加上了如何自導向特定目錄。

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

【Stable Diffusion web UI】[AI 作畫](Linux)無 NVIDIA 顯卡之伺服器運行測試 凡事就是要試試看,才知道最後的結果

【D語言】D language 安裝及使用 一種比較少見的程式語言

【Wickct】(縮短網址) 如何將網頁掛載到特定路徑下 Wildfly的預設網址又臭又長又不好記,而且會被看到後端的目錄路徑安排,當然能藏就盡量藏起來啦

【Maven】如何創建一個簡單可執行的JAR檔 滿重要的一個小功能,畢竟有時候是要傳遞的是JAR檔,而不是直接透過Maven直接部屬之類的

隨機好文

高捷少女:布拉格體驗㊤ 「可……可以去歐洲玩?而且還有人出錢?太棒囉!」婕兒忍不住歡呼起來,把扳手拋呀拋的,旁邊的客人紛紛轉過來看。「好了啦!」耐耐忍不住害羞起來,輕輕敲了一下婕兒的頭

艾米莉亞和高捷戀旅3(終) 「凝血神爪」,這是那名男子的綽號。會有這個稱號,是因為在他掌控下的夾娃娃機爪子,會變成比導彈還要準確、比刀劍還要凌厲的武器。關主看著那名男子,他已經選定了其中一座小型機台。這種小型機台裡面的娃娃都很小

【有趣玩物】4D Toys 用三維的視野探索未知的四維世界 在三維的我們看到的四維物體的互動是怎麼樣子的呢?這遊戲光是看看就超級有趣~

【阿瑞斯病毒】(影片示範)棘刺豬打法&打銀狐辛酸史 分享荊棘豬的打法,希望這一點點的經驗分享可以幫你節省大量的時間!

【英文作文】如何寫好英文作文 ~英文作文基本架構 從最簡單的英文作文框架開始下手,也就是俗稱的套公式,雖然很笨,但不失一個好辦法。