關於c語言scanf中n的問題,關於C語言scanf中 n 的問題

時間 2022-04-04 09:53:26

1樓:匿名使用者

我剛才用vs2008測試了一下,答案和你的一樣,估計是書錯了吧。個人認為scanf其實就是從乙個輸入佇列中取值,前面輸入的數字先被賦值。

2樓:匿名使用者

剛才查了一下,lz和我的結果一樣,應該是書上錯了在scanf裡 \n 很特別的,不是要求輸入乙個回車換行引用一下別人的說法:

過濾空格、製表符、回車等輸入,也就是說

scanf("%d\n", &i);

printf("%d\n", i);

你輸入乙個數後,它是不會立即顯示的,要等再接收到乙個非(空格、製表符、回車)的輸入scanf語句才結束。

但請注意的是,最後輸入的那個非(空格、製表符、回車)的東西是不會被這個scanf讀進來的,而是留在輸入流裡。

所以3會被x讀入,也就是說最後的6沒有被讀入

3樓:匿名使用者

vs2005測試結果跟你一樣

應該是不同編譯系統對i/o的處理方式不同

書上說的系統應該是有i/o就進行讀入,如果超過需要的內容就丟棄但vs系統中,將所有的i/o資料作為i/o流,然後所有的操作都對i/o流進行讀取,也就不會有丟棄資料的情況產生

比如,你可以一次輸入1 2 3 4 5 6,然後vs系統不會再等你輸入下一行,直接就輸出了

4樓:匿名使用者

這是乙個初學者最容易忽略的問題,首先**沒有問題,我沒有具體測試,在用scanf這個輸入函式前必須明白幾點,乙個『%d』對應逗號後面乙個『&』整型變數的值;在程式執行輸入時是按照原樣格式輸入的,有空格就加空格,有逗號就加逗號,全都以scanf("")""裡面的格式為準。雖然沒分,希望對你有幫助

關於c語言中scanf的問題

5樓:匿名使用者

scanf是c語言中的乙個輸入函式,與printf函式一樣,都被宣告在標頭檔案stdio.h裡,因此在使用scanf函式時要加上#include 。(在有一些實現中,printf函式與scanf函式在使用時可以不使用預編譯命令#include 。

)它是格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。scanf函式返回成功讀入的資料項數,讀入資料時遇到了「檔案結束」則返回eof。

6樓:

你好樓主!

不知道你對正規表示式熟不熟悉?

首先,scanf,sscanf這類輸入函式是支援一些簡單的正規表示式。scanf("as%s",j); 的正規表示式就是"as%s",即限制輸入要從as開始匹配,如果匹配不了,則認為輸入錯誤,即相當於沒有輸入。如果匹配到as則後面的%s會把輸入存放到f這個陣列裡。

你可以試試這樣的輸入語句scanf("%*[^#]%s", j);它的作用是忽略#這個符號之前的輸入,把後面的輸入存放到j這個陣列裡。

其次,接下來的現象是因為j這個陣列沒有初始化,而當沒有有效輸入時,輸出就是隨機的字元。在windos系統下可能會輸出「燙燙?」這樣的字樣

7樓:五胡十六國

scanf("as%s",j); 輸入錯了教你兩個吧

gets(j);這個能讀空格和字串

scabf ("%s",j);你的修改只能讀字串,見空格就停了

8樓:匿名使用者

檢查scanf()函式的返回值就清楚了。輸入格式不正確導致未讀入字串,而字元陣列是未初始化的,所以會輸出圖示結果。

9樓:

你的scanf中首先是「as%s」所以你輸入值得時候,你剛開始的前兩個必須是as,要不然就會出錯

c語言,scanf()函式中的一些問題。

10樓:匿名使用者

注意乙個地方,在輸入字元型資料時,你在之前為a輸入了乙個整形數,後加了個' ' 字元,

所以ch=' '

你可以改成與%c之間加個空格

11樓:雲之逝殤

因為在c語言中空格也算是一種字元,當你輸入第乙個正型後,空格一下,c語言就會識別你輸入的這個空格為你在正型後輸入的字元。

#include

int main()

你在scanf的%d後面加上乙個空格就可以正常輸入輸出了!

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

12樓:匿名使用者

你首先要明白,從鍵盤讀入鍵盤緩衝區(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()

關於c語言中scanf的問題,關於C語言中scanf的問題

scanf後面的 f格式,必須與輸入格式相一致 按您的輸入,中間用逗號,與scanf中 f之間格式不符,結果只接收了第1個變數,後面沒接收,因而是零 有的編譯器會是隨機數 正確寫法 1 如果 scanf中 f之間用空格,即 scanf f f f a,b,c 應該輸入1 2 3 中間有空格 2 如果...

關於c語言scanf輸入語句問題

這個是由scanf的第乙個引數決定的,前兩種情況相同。scanf d,d a,b 輸入乙個數字,再輸入 再輸入乙個數字,兩個數值之間 前後都行 有任意個空格或沒有空格 scanf d d a,b 可以 數字 空格 大於等於1個 數字,也可以 數字 回車 數字 scanf d d a,b 可以 數字 ...

關於C語言scanf遇到非法資料的問題

輸入444時的回車遺留在輸入緩衝區裡 因為scanf在 d控制下不接收回車符 被下面的scanf c y 當作乙個字元接收了 回車符也是字元啊 所以while還要迴圈,直接要求你輸入資料,但輸入的是字母不是數字,scanf d 不接收並留在輸入緩衝區裡,被下面的scanf c y 接收,while的...

關於C語言的問題,關於c語言問題

先說明一點,c語言中巨集和函式有些差別,巨集是 第乙個例子,double 1 2 這個呼叫實際上是2 1 2,看,x被為1 2,然後根據運算子的規則 實際上應該說是優先順序 先運算2 1,再加上2,所以結果是4。第二個例子就更簡單了,同樣是,toupper s i 這個呼叫,實際上它的 就是 a s...

關於C語言的問題,關於c語言的問題

選a,輸入函式scanf 是不能指定小數點精度的,d也不對,因為輸入的必須是位址,可以改成scanf f a 就對了。scanf f a 答案是d,應為你定義了實數,實數本身就可以帶小數點的,沒必要申明,在輸出時申明保留兩位就行了。scanf a scanf函式對小數字數沒有限制!關於c語言的問題 ...