回覆列表
-
1 # EXCEL進階課堂
-
2 # 嵌入式筆記v
strlen函式是以"\0"作為結束符,在計算字串長度時會去掉"\0"得到實際有效長度。但是你在建立陣列存放sacnf輸入的字元時,指定了長度,導致整個字串沒有"\0",導致strlen計算出錯。
strlen函式是以"\0"作為結束符,在計算字串長度時會去掉"\0"得到實際有效長度。但是你在建立陣列存放sacnf輸入的字元時,指定了長度,導致整個字串沒有"\0",導致strlen計算出錯。
【修正補充】看了網友的評價,我又再次仔細地看了看題主的問題,發現題主的問題其實包括兩個方面的問題:
其一:為什麼沒有輸入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的系列課程推出。