C語言中輸出菱形圖的一點感悟
C語言輸出菱形圖的一點感悟
有這麼一道題:編制輸出以下圖案的的程式。
或許對於剛學過C語言的新手朋友來說,這是一個很簡單的題,編寫多個printf輸出語句不就能夠得到它嘛,不錯,的確如此,但當我問你當我們中間最長的那排數字很大時,是不是也用同樣的方法去獲得呢?上述方法顯然是不可取的,我們有多重方法可以實現它,這就是C的靈活性,這裡介紹一個很簡單的方法,廢話不多說,首先貼出原始碼,咱們再依照他解釋:
下面對程式碼進行解釋:
首先定義兩個巨集用MIDDLE
printf("%*c %.*s\n", sp - 1, ' ', 2*i-1, STAR);
首先說一下關於%*中的*號,在這裡叫做賦值抑制符。他的作用是:標準說法:星號(賦值抑制符)對贏的輸入項按要求被掃視輸入,但結果不存貯,帶星號的說明不對應輸入資料存貯地址,用它來跳出一個輸入資料項(這是向對於scanf
在這裡,對於printf來說,以11行程式碼為例,%*c字元“*”表示輸出域由對應的輸出項來確定,上述“*”對應的輸出項是sp-1(假設sp-1等於4),那麼%*c就相當於%4c,那麼他就以%4c的格式輸出' ' (空格)。 同樣的對應%.*s也相類似,但這裡注意了為%.*s而非%*s
(裡面有點'.'),如果你誤寫成後者,這樣會得不到正確的結果哦!那麼%.*s 和%*s到底有什麼區別呢?%*s用法類似於%*c,
c輸出元值為其ASCII碼的字元,而s則代表輸出的一個字串,
(1)用格式符“%c”輸入或輸出一個字元,即逐個字元輸入輸出。
(2)用“%s”,則將整個字串一次輸入或輸出。
舉例:如果S = ABCDEF
那麼對於printf("%3s, %4.2s, %-7.4s, %.5s", s, s, s, s);則輸出
ABCDEF, AB,ABCD ,ABCDE
如果懂了這個,相信大家也就知道%.*s怎麼用了吧!
這裡值得一提的是,對於巨集STAR的定義裡面的字元數必須做夠多,否則當我們把n輸入很多後,可能自得不到我們預期的結果,即輸出的可能就不會是菱形了,這個大家可以驗證一下,那麼這是為什麼了,因為%.*s的輸出總要依賴於STAR,當前要求輸入很大時,而STAR有不夠提供,那麼當然會出現問題了,
利用STAR的字元數多少,我們還可以相應的變換輸出的圖案,可以實現多種不同的圖形哦,有興趣不妨試一下。