首頁>Club>
8
回覆列表
  • 1 # 廣西李少

    scanf函式是格式化輸入函式。


    對於這個題目是輸入整型的資料,在這裡就主要說一下%d格式的問題。


    我們通常輸入好幾個整數的時候,需要用分隔符來作為元素與元素間的分隔。


    在scanf函數里面,預設的分隔符,也稱為空白字元,通常是空格、回車和TAB鍵


    比如在在scanf函式中輸入(為了便於觀察,空格用┌┐表示,回車用←┐表示):


    “1┌┐2┌┐3←┐”,在計算機的緩衝區裡,存下的也是"1┌┐2┌┐3←┐"。


    除了這三個數外,還有三個字元。


    至於緩衝區是什麼,大家可以理解為快遞的倉庫。 快遞小哥把該地區各個地方的快遞收集,暫時存放在大倉庫裡(輸入)。 隨後把輸入的快遞按照地址投放給客戶(輸出)。 注意:每投遞出一個快遞倉庫就少一個物品,類比每從緩衝區讀取一個數據,緩衝區就少一個數! 其實scanf函式是有返回值的。 就像快遞一樣,正確投放一個快遞就會統計1個,沒有正確投放就返回錯誤。 scanf函式的返回值是正確賦值的數量,如果遇到錯誤或end of file則返回EOF。


    接上剛剛那個例子:


    int a,c,e; char b,d,f; scanf("%d%c%d%c%d%c",&a,&b,&c,&d,&e,&f,); 輸入1┌┐2┌┐3←┐


    則在計算機的記憶體裡,a=1,b=空格,c=2,d=空格,e=3,f=回車


    從這個意義上說,這些字元其實跟普通的輸入“數字”、“字母”是同樣的東西。


    現在看我們常見的兩個例子:


    int a,b,c; scanf("%d%d%d",&a,&b,&c); 輸入1┌┐2┌┐3←┐ 則分別輸出a,b,c的話結果是:1,2,3。。。。但如果這麼寫:


    char a,b,c; scanf("%c%c%c",&a,&b,&c); 輸入1┌┐2┌┐3←┐ 則輸出a,b,c的話結果是:1,┌┐,2。 在這裡,輸出的不是1,2,3,而是1,┌┐,2。


    而這裡,就是我們需要解釋的:


    不論在哪種情況下,緩衝區裡存放的資料都是:1┌┐2┌┐3←┐(一共6個)


    在第一種情況下,對%d賦值

    在這種情況下,scanf函式會自動識別並忽略輸入項前面的空白字元。 因此,它可以忽略2前面的空格,3前面的空格,回車既是字元也是輸入結束的標誌。 所以1存到a裡,2存到b裡,3存到c裡,正常輸出。


    在第二種情況下,對%c賦值

    在這種情況下,white字元也是被當做正常的輸入來對待,跟字元的1,2,3沒什麼區別。 它不會識別並忽略空格、回車、TAB鍵。 因此,緩衝區裡的前三個1┌┐2會分別賦給a,b,c。 所以輸出的結果是1┌┐2,看起來就是這樣:1 2


    在解釋完這些後,下面再看這個例子就容易了。


    char a,b,c; scanf("%c%c%c",&a,&b,&c); 輸入1←┐2┌┐3←┐ 則輸出a,b,c的話結果是:1,←┐,2。看起來就像這樣: 1 2


    因此,有了這個知識後,我們只用把回車鍵當做一個普通的字元儲存起來。


    我的程式設計思路是(不喜勿噴。。)


    直接進入死迴圈。

    先來個scanf("%d%c",變數地址1,變數地址2)來分別接受數字、分隔符的輸入

    先判斷數字輸入是否是-1,如果是-1跳出迴圈

    再判斷分隔符的輸入是否是回車,是的話存下是在輸入第幾個數後打的回車,記下序號

    一直迴圈,等待-1

    接受-1,跳出迴圈

    進行輸出,如果輸出的序號不是回車的序號,正常輸出。如果輸出的序號是回車,先換行再回車。

    結束

    在這個程式裡,我沒有定義迴圈的數量變數,我只用指標地址距離陣列初始地址的差值作為計數的變數。不習慣這麼寫的朋友可以定義 int i之類的變數。

  • 2 # L

    1、有一個很嚴重的錯誤,輸入字元陣列的兩個


    scanf("%d %s %c %c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);


    scanf("%s",&person[i].category.position);


    2、把這兩行中字元陣列輸入時前面的&符號去掉,對字元陣列輸入本身就是地址,不要加&,改成這樣


    scanf("%d %s %c %c",&person[i].num,person[i].name,&person[i].sex,&person[i].job);


    scanf("%s",person[i].category.position);


    3、其他的也沒有什麼錯誤,記著輸入時候,那幾個值之間用一個空格隔開,用scanf()函式輸入的時候,本質是,你給scanf一個地址,這個函式會根據你輸入的地址把,輸入緩衝區中的資料放在指定地址處


    4、像int ,char,double,long,float這些基本型別,再分配空間的時候,只是給他們一個空間,所以用scanf()輸入的時候,要加&取地址符號,才能給他們賦值


    5、然而char *,char [],這些本身是一塊區域的首地址,本身就是地址,所以用scanf時,不用加&因此,輸入裡面不需要加的只有,person[i].name,person[i].category.position兩個,其他的都是基本型別,因此都需要加

  • 3 # 少年的桂嬋

    scanf的工作原理:(一般情況,即格式串中沒有其它字元)使用者的任何輸入將被儲存在緩衝之中,當有scanf時,scanf則從此緩衝佇列中讀取字元,直至遇到空白字元或者是此字元不可能是本次的輸入為止,並把此字元放回原佇列,此字元成為佇列的第一個字元。

    當下一次scanf被呼叫時,將從第一個字元讀取,若此時為%d,%f,%g,%e等資料格式串,則可跳過空白字元,直至出現數字為止;若此時為%c等字元(串)格式串,則會把空白字元讀入,並給此變數賦值。

  • 中秋節和大豐收的關聯?
  • 女主名字叫做穆卿歌的穿越小說?