首頁>Club>
指標p不應該是5嗎為什麼是19?
5
回覆列表
  • 1 # EXCEL進階課堂

    【修正補充】看了網友的評價,我又再次仔細地看了看題主的問題,發現題主的問題其實包括兩個方面的問題:

    其一:為什麼沒有輸入5個內容就結束了?

    其二:為什麼輸出結果不是5,而是19?

    我只關注了題主用圖片表示的問題:即 為什麼輸出結果不是5,而是19?

    第一個問題:為什麼沒有輸入5個內容就結束了?

    問題原因:帶%c的scanf()函式在從鍵盤上接受字元的時候的特殊性

    題主程式當中,用一個迴圈執行輸入,做了5次,就是做了5次scanf()函式,可以理解為:

    scanf("%c%c%c%c%c",&s[0],&s[1],&s[2],&s[3],&s[4]);

    然後題主期望各元素裡面存放的值是:

    但是題主在輸入的時候採取了這樣的輸入方法

    a(換行)

    b(換行)

    c(換行)

    輸入到此時,發現只能輸入這3個字元,然後程式就結束了輸入。原因何在?

    計算機當中有一個叫鍵盤快取區東西,我們輸入的所有的內容都是存放在這裡面的,其中換行符也是一個符號,也會存在鍵盤快取區裡面去。採取題主這樣的輸入方法後,最後一個換行結束後,鍵盤快取區裡面存放的內容是:

    然後鍵盤快取區中的每一個字元會被%c依次接受到相應元素區。

    因為換行符是不可見的。所以,表面上看去你只輸入了3個字元,而陣列已經接受了5個字元了。這就造成了你感覺只輸入了3個的字元的結果。

    解決辦法:調整輸入方法

    像這樣輸入:abcde(換行)

    第二個問題:為什麼輸出結果不是5?

    問題原因

    1.你可能對strlen()函式的工作原理沒有弄清楚

    strlen函式是用來測試一個字串的長度。它的工作原理是:從第1個字元開始掃描,一直到遇到字串結束標誌\0。如果它不能掃描到這個標誌,它就會出現一些問題。

    我在VC6.0中試圖重演的你的錯誤。雖然出現了你原理相同的錯誤,但是最後的輸出值不相同。

    那麼,你想要的字串為什麼沒有結束標誌呢?原因就可能如下了。

    2.你可能對字元陣列作為普遍陣列和字串的情況沒有區分和掌握

    字元陣列可以當做普遍陣列和字串來使用。

    A.當作普通陣列的例子。

    char ch[5]={"a","b","c","d","e"};

    B.當作字串

    char ch[6]="abcde" ;

    請區分它們的區別。

    3.你可能對字串輸入到字元陣列方法沒有掌握

    如果你一個字元陣列需要用來儲存字串,則輸入的時候有兩種方法

    A.用帶%s的scanf函式

    如:char ch[6];

    scanf("%s",ch); //ch是字元陣列名,為該陣列首地址

    B.用gets函式

    如:char ch[6];

    gets(ch);

    同時請注意,這兩種輸入方法,能接受的字元型別是不一樣,具體的解釋,可以關注 嚴sir課堂 學習相關內容。

    問題解決

    方法1:改變字元輸入的方式(存在輸入越界風險),具體操作如下圖

    方法2:在題主的思路上進行修改(避免輸出越界),暫時考慮滿串情況

    這就是這個問題的回答。

    如果你覺得這個回答對你有幫助,請關注 嚴sir課堂, 我們有關於C的系列課程推出。

  • 2 # 嵌入式筆記v

    strlen函式是以"\0"作為結束符,在計算字串長度時會去掉"\0"得到實際有效長度。但是你在建立陣列存放sacnf輸入的字元時,指定了長度,導致整個字串沒有"\0",導致strlen計算出錯。

  • 中秋節和大豐收的關聯?
  • 大家都說媽寶男,那有媽寶女嗎?