ACM中回車的問題

紅緋魚發表於2014-11-08

大部分是在網上摘抄的,只有一點點是自己寫的,權當是mark一下。 1.回車的問題 比較四種讀入:字串輸入 getchar(), scanf(“%c”); scanf(“%s”), gets()區別

①&②: 其中getchar() 和 scanf(“%c”)的功能是一樣的。 這兩個函式讀入的是輸入流中當前位置的字元,比如: scanf(“%d”,&n); c = getchar(); 假設輸入 67/ (假設“/”代表回車),則第一個scanf讀入一個整數67後,當前輸入流的位置是67之後,即指向回車符,所以第二個getchar()讀入的就是一個回車符了,即 c = ‘\n’。

③ 同樣,gets()也是從當前位置讀入一行字串。 比如: scanf(“%d”,&n); gets(str); 此時讀入字元陣列中的字串就是“\n” 了 所以通常在用scanf讀入一個非字串的型別之後,如果要讀入字元,或字元陣列,都用一個額外的getchar()把回車符讀掉,若後面跟的不止一個回車符,可能還有多餘的空格的話,就用gets()讀掉。

④ 和以上不同的是,scanf(“%s”) 讀入的時候是會忽略掉空格,回車和製表符的。並且以空格,回車和製表符作為字串結束的標誌。 也就是說,scanf("%s")其實是比較特殊的,它一定會等到所有空白符結束,一直等到它要等的字串出現,它才讀取,在字串出現之前,出現的所有空白符都會忽略掉。

經常會有這樣的題,輸入第一行是一個整數,接下來每行的第一個是一個字元,用來表示某種操作,後面再跟一些資料,比如: 4 A 100 2 B 23 A 23 89 B 34 像這種輸入就需要小心,讀入字元時不要讀成回車符。 為了防止意外,我一般是這樣處理這類輸入的: char model[2]; Scanf(“%d”,&n); for(…,…,…) { scanf(“%s”,model); if(model[0] == ‘A’){} else{} }

無論用cin還是scanf ,讀入字元之後若要再繼續讀入,應消去換行符,可使用scanf("%*c")或者getchar().

相關文章