欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言之如何用isspace()和ungetc()實現(xiàn)前導(dǎo)空白字符過濾

 更新時間:2025年04月10日 15:49:19   作者:牧木江  
這篇文章主要介紹了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)解析

  1. 循環(huán)讀取:通過while循環(huán)持續(xù)讀取字符,直到遇到EOF或非空白字符
  2. 字符判斷:使用isspace()過濾所有類型的空白字符
  3. 字符回推:檢測到第一個非空白字符后,使用ungetc()將其放回輸入緩沖區(qū)
  4. 后續(xù)處理:主程序可以正常讀取到過濾后的第一個有效字符

注意事項

  1. 回推限制:ANSI C保證至少1個字符的可靠回推,多個字符的回推行為取決于具體實現(xiàn)
  2. 流類型:適用于所有標(biāo)準(zhǔn)輸入流(stdin)及文件流
  3. 錯誤處理:需考慮EOF的邊界條件
  4. 編碼兼容:完美處理ASCII編碼,對寬字符需要改用iswspace()

通過這種組合使用,我們可以優(yōu)雅地實現(xiàn)輸入流的預(yù)處理,為后續(xù)的字符處理打下良好基礎(chǔ)。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • c++11封裝thread庫的方法示例

    c++11封裝thread庫的方法示例

    C++11 ,封裝了thread的多線程的類,這樣對多線程的使用更加方便。下面這篇文章主要給大家介紹了關(guān)于c++11封裝thread庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2019-01-01
  • C++使用string的大數(shù)取模運算(5)

    C++使用string的大數(shù)取模運算(5)

    這篇文章主要為大家詳細介紹了C++使用string的大數(shù)取模運算,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C++?基本數(shù)據(jù)類型中int、long等整數(shù)類型取值范圍及原理分析

    C++?基本數(shù)據(jù)類型中int、long等整數(shù)類型取值范圍及原理分析

    這篇文章主要介紹了C++?基本數(shù)據(jù)類型中int、long等整數(shù)類型取值范圍及原理分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C/C++ 避免數(shù)組越界的方法

    C/C++ 避免數(shù)組越界的方法

    這篇文章主要介紹了C/C++ 避免數(shù)組越界的方法,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C++11 簡單實現(xiàn)線程池的方法

    C++11 簡單實現(xiàn)線程池的方法

    這篇文章主要介紹了C++11 簡單實現(xiàn)線程池的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 詳解計數(shù)排序算法及C語言程序中的實現(xiàn)

    詳解計數(shù)排序算法及C語言程序中的實現(xiàn)

    技術(shù)排序算法與我們普通接觸的冒泡排序和快速排序等基于元素比較的算法不同,在編程中通過C語言的數(shù)組能夠清除地表達出來,這里我們就來詳解計數(shù)排序算法及C語言程序中的實現(xiàn)
    2016-07-07
  • C語言變長數(shù)組 struct中char data[0]的用法詳解

    C語言變長數(shù)組 struct中char data[0]的用法詳解

    下面小編就為大家?guī)硪黄狢語言變長數(shù)組 struct中char data[0]的用法詳解。小編覺得挺不錯的現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++中的動態(tài)規(guī)劃子序列問題分析探討

    C++中的動態(tài)規(guī)劃子序列問題分析探討

    可能有些讀者有接觸過動態(tài)規(guī)劃,可能也有一些讀者以前完全不知道動態(tài)規(guī)劃這個東西,別擔(dān)心,我這篇文章會為讀者做一個入門,好讓讀者掌握這個重要的知識點
    2023-03-03
  • C語言實現(xiàn)簡單彈球游戲

    C語言實現(xiàn)簡單彈球游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單彈球游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 純C語言:貪心Prim算法生成樹問題源碼分享

    純C語言:貪心Prim算法生成樹問題源碼分享

    這篇文章主要介紹了貪心Prim算法生成樹問題源碼,有需要的朋友可以參考一下
    2014-01-01

最新評論