求問一下關於c語言scanf函式的一些問題就是說輸

2021-12-23 08:25:36 字數 5322 閱讀 3394

1樓:風雷九州

scanf的輸入方式完全要看**的書寫方式了。

先來講一下scanf的輸入原理吧:

1、scanf輸入流的概念,當執行到scanf函式時,會檢查輸入流,如果為空,則要求使用者輸入。如果不為空,則根據scanf的格式化引數從輸入流中讀取

2、%d 用來輸入一個整數型別,會跳過開始的空白字元(空格 tab 回車都算空白字元),一直掃描到第一個數字開始,然後開始往後掃描,當碰到空白字元或者非數字時停止,然後將前面的數字賦值給對應的變數。如果第一個不是數字,則scanf返回失敗。

而%3d %2d這種頻寬度修飾時,會最多掃描寬度的字元就停止。並且如果沒有掃描到寬度就碰到空白字元或者非數字時也會停止

3、%c 用來輸入一個字元,不會跳過最開始的空白字元。從輸入流的第一個字元開始。

如果有%3c這種頻寬度修飾時,會強制掃描寬度的字元,但是隻會將第一個字元賦值給對應的變數。

4、%s 用來輸入一個字串,會跳過開始的空白字元(空格 tab 回車都算空白字元),然後從第一個非空白字元開始,然後開始往後掃描,當碰到空白字元停止,然後將前面的字串賦值給對應的變數。由於碰到空白字元停止,所以%s無法接受進來空格。

5、%f 用來輸入一個單精度浮點數型別,也就是float型別,其他同%d

6、%lf 用來輸入一個雙精度浮點數型別,也就是double型別,其他同%d

對於你上面的問題

scanf(%3d%2d%3c,&a&b&ch)

輸入123空格46空格abc

輸出的是a=123 b=46 c=空格 才對

2樓:匿名使用者

格式控制符%3c對應的引數型別應該是指向字元陣列的指標,傳字元型變數的地址,結果就是無法預料的——不在意修改與 ch 相鄰的記憶體區域的後果的話就當我沒說

以下**

#include

int main()

輸入123 46 abc

輸出a=123 b=46 c=' ab'

可見老師明顯講錯了

3樓:

有寬度修飾時資料不用分割,否則要分割

4樓:匿名使用者

寬度修飾是針對輸出的資料寬度的限制,和輸入資料沒關係,輸入資料肯定要分割的啊

5樓:匿名使用者

%3d表述輸出一個整數,佔3個空格的位置,不足左邊補空格。

c語言scanf函式輸入時鍵盤緩衝區\n的問題

6樓:匿名使用者

你首先要明白,從鍵盤讀入鍵盤緩衝區(buffer)的資料都是以ascii碼儲存的(包括回車)。

程式1#include "stdio.h"

void main()

鍵盤輸入

97《回車》

第一次回車後,buffer中的ascii:39h,37h,0ah(0a是換行的ascii), scanf會根據格式字串中的第一個%d對buffer按位元組順序讀取,當讀取到0a時,認為%d型的資料結束,此時把已經讀取到的39h,37h依據%d轉為整型資料97儲存在字元型變數a中。(這裡是除去了掃描截止點0ah)

此時buffer中已經無任何資料了。

96《回車》

第二次回車後,按同樣的流程,scanf會根據格式字串中的第二個%d對buffer按位元組順序讀取。最終b得到96.

此時buffer中已經無任何資料了。

輸出97 96

程式2#include "stdio.h"

void main()

鍵盤輸入

9《回車》buffer:39h,0ah

因為scanf會按照第一個%c格式掃描buffer(只掃描一個位元組就結束),然後把掃描到的39h直接送到變數a(當以%d格式讀出來時,39h就是57)

此時,buffer中只有:0ah。

然後,scanft又遇到第二個%c,繼續掃描buffer,得到0ah並送入變數b.

此時buffer中已經無任何資料了

輸出57 10

程式3#include "stdio.h"

void main()

鍵盤輸入

abc《回車》

第一次回車後,buffer:61h,62h,63h,0ah。

scanf會按照%s的格式對buffer按位元組順序掃描,當掃描到0ah時,結束掃描(按照%s的要求,空格20h也是掃描結束點)。

然後把掃描到的(除去最後一個判斷掃描截至的位元組0ah)資料直接送入以a為起始地址的字串。

此時,buffer無任何資料了。

def《回車》

第二次回車後,buffer:65h,66h,67h,0ah.掃描的流程與上面的完全一致。

輸出abc def

程式4#include

void main()

鍵盤輸入

1《回車》,

這裡scanf執行了兩次(i==0時,與i==1時),而且每次都是想對j賦值。

第一次scanf,按%c的要求,只掃描buffer中的一個位元組,但是buffer中並不資料,於是要求鍵盤輸入資料到buffer,此時的1《回車》代表向buffer中輸入了:31h,0ah。

然後按%c的要求,只掃描buffer中的一個位元組:31h,並將它直接送入變數j.

此時,buffer中還留下:0ah。

第二次scanf要求鍵盤輸入資料,按%c的要求,只掃描buffer中的一個位元組:0ah,並將它直接送入變數j.

此時,buffer無資料了。

最後,你用%d格式輸出j的值(0ah換成整型就是10)

輸出10

程式5#include

void main()

1《回車》2的情況:

scanf會按照格式控制字串的要求,順序掃描buffer.

但是你其中有一個空格,這個很特殊,我也是第一次發現這個問題(一般我都不會在scanf中加入任何常量字元)

我測試了一下:我發現這個空格有吸收回車(0ah)和空格(20h)的「神奇功效」,吸收之後再要求buffer給一個位元組,直到這個位元組不是0ah或者 20h,此時把這個位元組交給下一個格式字串。

第一次迴圈時遇到格式字串空格,就掃描buffer中的一個位元組,但是buffer中無資料,要求從鍵盤輸入資料:1〈回車〉,buffer中有資料了——31h,0ah。再讀取到位元組31h,scanf發現這個並不是0ah/20h,就把這個位元組31h交給格式字元%c處理。

迴圈結束,此時buffer裡面還有:0ah.

第二次迴圈時遇到格式字串空格,就掃描buffer中的一個位元組——0ah,發現是0ah/20h,於是就要求buffer再來一個位元組。此時buffer裡面已經沒有資料了,要求鍵盤輸入:2.

buffer中有資料了——32h,0ah。於是再讀一個位元組31h,scanf發現這個並不是0ah/20h,就把這個位元組32h交給格式字元%c處理(j最終得到32h)。

迴圈結束,此時buffer裡面還有:0ah.

這裡有一篇關於printf的帖子

程式6#include "stdio.h"

void main()

鍵盤輸入

1《回車》

問題5:

你的編譯器vc認為%d資料應該是4個位元組,但是你採用的是%c讀資料,

scanf("%c",&a);此句讀到的是1的ascii碼:31h.然後把31h直接送入地址&a(而並沒有改寫a的三個高位元組地址)。

scanf("%c",&b);同理。

你可以用printf("a=%x,b=%x\n",a,b);來驗證我說的。它們的最低位元組肯定是31h,0ah。

ps1:

當你把 int a;int b;放在main()外進行定義時,a,b的初值就是0。此時你會得到正確的結果。

當你把 int a;int b;放在main()內進行定義時,a,b不會被初始化(它們的三個三個高位元組地址的內容是不確定的),你就會得到上面錯誤的結果。(定義的動態變數都不會被初始化,靜態變數會被初始化為0)

ps2:以下也是不正確的用法。

char c;

scanf("%d",&c);/當你用%d給c賦值時,會對從&c開始的連續4個位元組進行賦值。當從buffer得到的值是在一個位元組範圍內(-128~127),下面是可以正常輸出的。但是不管怎樣,這樣做是很危險的——越界。

printf("%d",c);

***************==請你測試下這個程式********************====

#include "stdio.h"

void main()

/*如果得到的結果是00 00 00 01 02就說明我的結論是正確的(258的轉為16進位制數就是00 00 01 02h,然後scanf會把這個數放入以c為起始地址的)

***************=以下程式也是********************==

#include "stdio.h"

void main()

7樓:

你忽略了一個問題,就是scanf的格式控制符的用處。%d只接受整數的輸入,%c和%s可以接受字元的輸入,其中也包括\n等轉義字元。因此「scanf輸入遇到空格、跳格、回車才會從緩衝區往變數送字元」不是絕對的。

清楚了%c %s可以接受字元,問題就解決了。

至於程式6,我不用vc不清楚,但gcc是可以通過的

8樓:

getchar 和 %c 格式 涉及 '\n',常使初學者困擾。

清除緩衝區殘存資訊其實很簡單:

fflush(stdin);

就可以了,這樣,後面的讀就不受前面的影響。

鍵入資料的格式應當與輸入語句格式相配:

char a; 相當1位元組整型。所以可以用%d格式輸入。用%d格式,預設分隔符是所有的 white-spaces

用%c格式輸入,則按ascii字元考慮。無分隔符。必要時用fflush(stdin);清除緩衝區

%s 是 字串格式,預設分隔符是所有的 white-spaces,輸入後自動有結束符"\0".

c語言中的scanf的用法

9樓:肥仙女

scanf 函式最bai主要的用法是:

scanf("輸入du控制符", 輸入引數);

函式原zhi型:daoint scanf(const char * restrict format,...);

函式 scanf() 是從標準版輸入流stdin (標準輸入裝置,一般指向鍵盤)中讀

權內容的通用子程式,可以說明的格式讀入多個字元,並儲存在對應地址的變數中。

求C語言大神幫忙解決一下關於巨集的兩個習題,要習題7和8詳細解答過程

第七題,逐層代入即可 語句為print f 3 x 代入print定義 pr f 3 x putchar n 代入pr printf d int f 3 x putchar n 代入fprintf d int 3.84 3 x putchar n 於是輸出的是 int 3.84 3 x int 3....

問一下關於XBOX360 SLIM破解的問題

3 slim有點難度,系統沒有升級到13146之前還是9504,相對來說最容易,按照教程操作,把光碟機開啟至除錯模式,提取出原始資料,千萬記住要備份,之後合併寫入,操作時注意若有一處和教程不符合就不要隨便亂來,刷磚了沒人救你,若升到13146光碟機就不是9504了,搜尋相關教程處理,若升級到1359...

問一下關於微單相機的問題

這個不一定要大牌子就好,單反領域尼康佳能覺得是可以的,但微單相機每家都有特點,關鍵挑選一款最適合自己的才最重要,個人很推薦sony的微單,我同學買了一個,我也玩了入手很快,效果很好,特別是sony機器裡的軟體功能很強大。至於你挑選的兩款機型,我建議奧林巴斯,套機頭14 42更實用,尼康的是10 30...