哈囉大家好,這裡是回歸初心的小編過路君子
從 C 開始學怎麼寫程式,卻已經快要兩年沒有寫任何一個 C 的程式碼......
在小編那時學 C 的時候程度還不夠,所以沒有要將讀取到的資料餵入陣列的問題,直到最近才突然要寫 C 且遇到這個問題。
所以首先就要來看看小編要讀取的資料格式:
5
X . . P .
. . . . .
P . . . .
. . . . .
. . . . P
第一行會輸入一個數字 n,表示接下來會輸入一個 n * n 的陣列。
而接下來的 n 列資料都是該陣列的資料,以空格和換行做區隔。
所以小編採用了以下的策略來讀取資料:
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 了,難得回來寫一下,沒想到剛寫就踢到鐵板。
有必要玩這麼刺激嗎......