允許在同一時間(或多或少)分解一行代碼:
scanf("%d",&tc);
讀取的整數成TC
while(tc--)
個
環路TC倍
scanf("%d",&n);
讀取的整數爲n個
gets(str);
讀取的行的其餘部分成str
,刪除尾部換行符
puts(str);
打印出字符串,緊接着換行
所以你讀一個整數,然後讀取那麼多整數+其餘的行對和打印出行(但不是整數 - 它們會被扔掉)。讀取一個整數需要在整數之前跳過任何空格(空格,製表符和整個空行),但在整數之後不會有任何空格,所以這可能有點令人困惑,這取決於您提供給程序的輸入類型。
在你的榜樣,你說你餵養它的輸入:
3
4
anil kuma
2
abc
4
ams
所以讓我們去通過該計劃,看看它做什麼:
- 閱讀整數
3
到TC
- loop 3 times
- (first loop)
- 讀取
4
成n
- 讀取線(空白)到
str
的其餘部分,
- 打印空白行
- (第二循環)
- 嘗試讀取的整數爲n個,但輸入(
anil kuma
)不是整數,所以設置錯誤標誌在stdin
- 讀取線(
anil kuma
)的其餘部分成STR
- 打印
anil kuma
- (三環路)
- 讀
2
成n
- 讀取線(空白),其餘爲
str
- 打印空白行
- 循環完成,回退出碼34.
你從來不檢查重打開的功能或標準輸入錯誤代碼值,讓你有想在第二次迭代讀一個整數的錯誤其實是完全不可見。
你可能會得到一個輸出更喜歡你正在改變你的scanf期待什麼叫到:
scanf("%d ", &n);
注意:%d轉換後的額外空間,從而導致scanf函數讀取和扔掉whiltespace直到找到一個非空白字符。這將導致它扔掉整數後的換行符,以及任何後續的空行和任何空白/製表符在下一個非空行
主要的聲明後,空間不應該是這樣的...你有什麼要完成? – 2011-12-26 20:27:15
這是可怕的代碼。你爲什麼要在'tc'(應該是'char **'類型)中做第一個'scanf'參數? – 2011-12-26 20:27:59
我們可以在main(), – 2011-12-26 20:28:41