求C語言的大神!!為什麼我把scanf放到while 1 和之間就會提示後面的break非法呢

2021-04-28 17:35:16 字數 3590 閱讀 4207

1樓:網海1書生

switch中的break只是

bai用來退出

duswitch的,所以不管輸入對錯,zhi後面的dao**都會執行的專

。你的**實在太亂了,我屬只好整理一下了:

#include

int main()else if(f<0||f>100000)else

printf("\n");}}}

c語言scanf越界問題

2樓:匿名使用者

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

3樓:

scanf("%5s",a)這種輸入方法是可以的,可以防止陣列越界問題,不過這裡你應該寫成scanf("%4s",a),讀入的字元數一定要小於陣列長度。因為字串的最後有個'\0'作為字串的結束標誌,沒有這個標誌就不能稱之為字串。 fgets也是可以的,因為在函式中給出了陣列的長度,函式內部會檢查其長度,保證不會越界。

求大神幫忙看看下面這個C語言程式,為什麼不管輸入多少值給i,出來的結果都是一樣的

printf語句裡應該是 p 記錄的是位址 你用的int c語言,求大神看看,為什麼不管輸入什麼數,結果都是0.000000 double sqr double double x 求大神看看這個c語言程式 出錯了,為什麼得不到正確結果 你的程式貌似沒有什麼問題,include include int...

c語言求整數的所有質因子謝謝大神我是

測試結果 請輸入乙個數n,n的所有質數因子 5202 5 13 源 include stdio.h include conio.h int isshushu int n return 1 main getch 思路 乙個函式isshushu 用來判斷給定 的數是否是素數從1到n的一般,乙個乙個排查,...

求大神解決C語言程式設計錯誤我在這謝謝各路大神指教指教不勝感激

你定義的資料太大了,棧沒那麼大空間。把你的shuju用malloc來申請記憶體。你這應該是微控制器c吧?我不太懂,不過提示的錯誤是段的長度問題你把storage函式中的 struct shuju 500 放到棧上可能會導致空間不足 放到函式外面試試,如果支援動態申請記憶體的話,動態申請可能會更好 s...