scanf的理解與使用[個人體會]


最近一直在學習C語言,大學的時候沒好好學,想不到10多年之后,我又開始學起來了,話說C語言確實相當有意思,至少比Python有意思。

 

我就寫一下C語言內置的scanf函數。我的理解這是一個格式化輸入的函數,用於讀取信息並將信息寫入指定的地址內。

 

常規的用法

#include <stdio.h>

int main(){
    
    int a, b;
    
    scanf("%d%d", &a, &b);
    
    return 0;
    
}

除了%c的格式化相對特殊一點,%d,%f,%e等,scanf在讀取的時候, 就以上面的程序為例子,當我們輸入2[空格]3[回車]后,a與b變量就會進行賦值。

在讀取的時候,由於第一個%d需要讀取一個整數字符,讀取的時候首先會忽悠前面所有的空白字符包括空格,回車,制表符。當讀取到第一個顯示字符的時候,會取匹配該字符是否為數字,如果為數字就讀取,並讀取下一個,一直讀取到非數字字符,函數會將讀取到的數字信息寫入變量,然后再將讀取到非數字信息重新放入文字緩存區,供后續的使用。這時第二個%d也將開始進行匹配,它讀取到了第一個前面讀取過並重新放入緩存區的空格,也會進行忽略,並開始讀取匹配的信息,直到最后讀取到回車的字符,同樣的操作,復制變量,並把該回車符放入緩存區供后面的函數使用。所以如果這個時候想清空文字緩存區的數據,就需要使用getchar()函數,讀取最后緩存取里面的回車字符。

但如果格式化的里面,添加了其它的參數,效果就不同了比如下面的代碼

#include <stdio.h>

int main(){
    
    int a, b;
    
    a= b = -1;
    
    scanf("%daaa%d", &a, &b);
    
    printf("a = %d, b = %d\n", a, b);
    
    return 0;
    
}

我在格式話的里面插入了aaa的文字,格式化輸入么,既然你定制輸入要求了,那scanf內置默認的空格匹配就失效了。假如我輸入[空格][制表符]1[空格]aaa3,第一個1的情況,還是跟上面我的分析一樣,第二個就不一樣了,你既然自定義了匹配信息,aaa,它將選擇緩存區里面的aaa開頭的信息,然而不幸的是,緩存區的數據是[空格]aaa,根本無法匹配上,導致第二個變量無法進行賦值。

上面的分析可能有點歧義,我這里重新再寫一下,當scanf運行的時候,只要能夠匹配信息,它會一直匹配下去,而且如果匹配的是%d這些數字字符,會忽略前面所有的空格字符信息

注意只有匹配到%d的字符的時候,才會剛好忽略空格字符信息,另外的字符信息出現,必須嚴格匹配。

所以前面的理解

輸入1aaa[空格]2[回車]就可以讀取到全部字符信息。

因為當1aaa匹配好的時候,雖然把空格重新放入了字符緩存區,但下一個匹配字符是%d,它可以忽略前面所有的空字符,所以自然可以實現要求。

scanf會處理掉匹配的字符信息。

假如輸入

1aab[空格]2[回車]

第一個變量還是能夠正常的賦值,緩存還剩下的信息為b[空格]2[回車]。

 

所以,當匹配%d,%f的時候,你可以假想它前面就像有一個正則的[ '\n'\t']*的通配符,會默認幫你處理這些空白信息,當然你可以手工放入一個空白字符,效果還是一樣的,也可以說沒效果。

 

最后我寫一些關於%c的情況,

scanf("%c", &a)

這個本來跟getchar效果一樣,讀取一個字符進來,並賦值給a,但有些時候,輸入中,總會有一些空格或者回車的干擾,這次我就碰到了這樣的問題。

#include <stdio.h>

int main(){
    
    char a, b;
    
    scanf("%c%c", &a,&b);
    
    printf("a = %c, b = %c\n", a,b);

    
    return 0;
    
}

我輸入了a[空格]b[回車],b賦值到了空格,字符緩沖區剩下b與回車

在讀取字符的時候,匹配不會默認幫你去掉空字符,這個時候,如果你需要匹配非空字符,可以在需要匹配的字符前面手工加上空格,自動幫你匹配去掉空字符

#include <stdio.h>

int main(){
    
    char a, b;
    
    scanf(" %c %c", &a,&b);
    
    printf("a = %c, b = %c\n", a,b);

    
    return 0;
    
}

這樣就可以去掉配置字符之前的所有空白字符信息了,注意不要在最后面也添加一個空格,這樣會導致按下回車的時候,緩沖取的所有字符都將被匹配完,阻塞等待新的輸入,如果你輸入了空白字符是沒用的,因為空格可以無限匹配空白字符,只有輸入一個可顯示字符才會停止阻塞。

 

自己寫了一下博客,感覺對scanf的了解基本差不多了,scanf還有返回值,應該是顯示匹配的字符信息數量,我一般沒用,查了很多中文資料的網站,我覺的,我這篇應該是寫的最清晰的了【不要臉】

 

最后,說一句,人生苦短,放棄Python,C語言才是王道。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM