解決讀入字串的緩衝區溢位問題-1(不完美解決方法)

當宣告字元陣列時,賦予此陣列一個固定的大小(記得要留最後1個位置給\0),50個字元就給予大小51(50字元+最後的1個\0),嘗試用函式來處理字串時,先呼叫函式並將文字陣列位址傳遞以及陣列最大值(0~XX)【大小[51]就是50,[101]就是100】,函式名稱為keyin,傳遞陣列g,大小51(即為50),記得陣列式從[0]開始,所以g[0]~g[50]有51個,剛好與宣告的51個一樣。例如:keyin(g,50);
函式中設定for迴圈,基本上也是從0開始,停止條件要小於50,因為50是要給字串中的\0作判斷結束,不可<=50,會造成陣列資料儲存溢位問題。
練習程式如下:

#include<stdio.h>
#include<string.h>
void keyin(char [],int);
int main(){
char g[51];  //g陣列大小51個
keyin(g,50);//呼叫函式,傳遞g陣列位址,並賦予第0~50共51個
printf("%s\n",g);//將字元陣列g(已經經過函式處裡)%s印出。

return 0;
}
void keyin(char a[],int n){ //(主)陣列g記憶起始位址給(函式)陣列a,賦予大小0~50給予使用。
int i=0;//掃描stdin空間次數(等待儲存鍵盤輸入內容)。
for(i=0;i<n;++i){//第0次(對應字元陣列[0])開始,直到第49次(0~49=50),但i還是會加到50,判斷50>50不成立,停止執行內容。
scanf("%c",&a[i]);//等待鍵盤輸入後存取至stdin,之後掃描stdin共i次(0~49),最多i=50停止
if(a[i]=='\n')//如果掃描未到第49次以前(輸入字元未滿最大空間)收到換行\n(也就是鍵盤輸入enter)字元,停止迴圈。
break;
}
a[i]='\0';//最後陣列位置第50存取字串結束標記\0,或者停止迴圈時,當下i為多少,字元陣列[i]~最大位置[50]皆為\0。
}

留言