C語言之如何用isspace()和ungetc()實現(xiàn)前導(dǎo)空白字符過濾
問題場景
當(dāng)使用getchar()
進行字符輸入時,我們經(jīng)常需要跳過輸入流開頭位置的空格、制表符、換行符等空白字符,直到遇到第一個有效字符為止。這在處理用戶輸入或解析文件時尤為常見。
對于初學(xué)者來說,在做算法練習(xí)的時候也會遇到如先為int類型的變量輸入一個值,后再輸入一個字符串的情況。此時由于不知道兩次輸入之間的空白字符的數(shù)量以及類型,處理前導(dǎo)的空字符便成了一個稍麻煩的問題。
洛谷許多題目進行不同行輸入時通常采用的是"\r\n"而不是單純的"\n",樓主曾經(jīng)就嘗試使用游離的getchar()處理兩次輸入之間的’\n’,結(jié)果一道橙題折騰了一晚上也沒AC…
關(guān)鍵函數(shù)說明
1. isspace()函數(shù)
#include <ctype.h> int isspace(int c);
- 判斷傳入的字符是否是空白字符
- 支持的空白字符包括:空格(’ ‘)、換頁符(’\f’)、換行符(‘\n’)、回車符(‘\r’)、水平制表符(‘\t’)、垂直制表符(‘\v’)
2. ungetc()函數(shù)
#include <stdio.h> int ungetc(int c, FILE *stream);
- 將指定字符推回輸入流
- 常用于"偷看"下一個字符后需要還原的場景
- 最多保證1個字符的可靠回推
解決方案
#include <stdio.h> #include <ctype.h> void trim_leading_whitespace() { int c; // 跳過所有空白字符,注意這里while后面的分號 while ((c = getchar()) != EOF && isspace(c)); if (c != EOF) { ungetc(c, stdin); // 將第一個非空白字符放回緩沖區(qū) } }
使用示例:
int main() { printf("請輸入帶空格的字符串:"); trim_leading_whitespace(); int ch; printf("處理后的首字符:"); if ((ch = getchar()) != EOF) { putchar(ch); } // 讀取剩余字符 printf("\n剩余字符:"); while ((ch = getchar()) != '\n' && ch != EOF) { putchar(ch); } return 0; }
運行效果:
請輸入帶空格的字符串: Hello World
處理后的首字符:H
剩余字符:ello World
實現(xiàn)解析
- 循環(huán)讀取:通過
while
循環(huán)持續(xù)讀取字符,直到遇到EOF或非空白字符 - 字符判斷:使用
isspace()
過濾所有類型的空白字符 - 字符回推:檢測到第一個非空白字符后,使用
ungetc()
將其放回輸入緩沖區(qū) - 后續(xù)處理:主程序可以正常讀取到過濾后的第一個有效字符
注意事項
- 回推限制:ANSI C保證至少1個字符的可靠回推,多個字符的回推行為取決于具體實現(xiàn)
- 流類型:適用于所有標(biāo)準(zhǔn)輸入流(stdin)及文件流
- 錯誤處理:需考慮EOF的邊界條件
- 編碼兼容:完美處理ASCII編碼,對寬字符需要改用iswspace()
通過這種組合使用,我們可以優(yōu)雅地實現(xiàn)輸入流的預(yù)處理,為后續(xù)的字符處理打下良好基礎(chǔ)。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++?基本數(shù)據(jù)類型中int、long等整數(shù)類型取值范圍及原理分析
這篇文章主要介紹了C++?基本數(shù)據(jù)類型中int、long等整數(shù)類型取值范圍及原理分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11C語言變長數(shù)組 struct中char data[0]的用法詳解
下面小編就為大家?guī)硪黄狢語言變長數(shù)組 struct中char data[0]的用法詳解。小編覺得挺不錯的現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01