2014-04-19 64 views
0

我有一個小程序,在那裏我說我想輸入數組的行和列的數量,然後輸入信息來填充該數組的數據。它接下來做什麼並不重要,只是省略了代碼的一部分並將其放入(...)中。如何限制二維數組上的輸入,使其不會爆炸?

int main(){ 
int nl, nc,i,j,z,n; 

scanf ("%d %d\n", &nl,&nc); 

char matrix [nl] [nc]; 

for (i=0;i<nl;i++) 
    for (j=0;j<nc;j++) 
     scanf(" %c",&matrix[i][j]); 
scanf("%d",&n); 

int s[n*2]; 

for (z=0;z<n*2;z++) 
scanf("%d",&s[z]); 

int y=0; 
char s2[n]; 
for (z=0;z<n*2;z+=2){ 
s2[y]=matrix [(s[z])-1][(s[z+1])-1]; 
y++; 
} 

for (z=0;z<n;z++) 
printf ("%c", s2[z]); 
return 0; 
} 

我的問題是,如果輸入比我應該更多的字符,它會炸燬。例如,如果我的輸入是:

2 3 
ABC 
DEF 

這工作得很好。

但如果我把:

2 3 
ABC 
DEFF 

它給我一個分割摺疊並停止該程序。請記住,我在scanf中的「%c」之前有一個空格,所以它忽略了輸入中的「\ n」和空格。

我能做些什麼來阻止陣列中的額外字符爆炸?

+2

不可重現。 [現場演示](http://ideone.com/76TDfx)。你的錯誤在別處。 –

+0

Hi @ n.m。,如果你願意的話,我可以放下其餘的代碼...下一步是另一個scanf。爲什麼我應該用另一個輸入進行分段摺疊? –

+0

很難弄清楚爲什麼程序崩潰而沒有看到崩潰的程序。您決定是否要發佈一個。 –

回答

0

好吧,我發現它的問題是輸入到緩衝區。爲了解決這個問題,我在使用下一個輸入前清除了緩衝區:

while (getchar() != '\n'); 
-2

使用%s而不是%c並刪除內部循環。所以代碼將是這樣的:

for(i=0; i<nl; i++) 
{ 
    scanf("%s", &matrix[i]); 
} 
+2

這個「答案」是完全錯誤的,因爲緩衝區溢出和終止NUL字符。 –

+0

是的,我很抱歉。我的壞 –

-1

您的問題是填充該大小的數組。

您可以通過文字讓你輸入的字符,如果你輸入的字符超過您的數組大小,程序會停止或已邏輯錯誤,

所以,你可以使用getche()和檢查數組約束。

您可以編輯代碼如下:

int main(){ 
int nl, nc,i,j; 

scanf ("%d %d\n", &nl,&nc); 

char matrix [nl] [nc]; 

for (i=0;i<nl;i++) 
    for (j=0;j<nc;j++) 
     matrix[i][j]=getche(); 
(...) 
return 0; 
} 
+0

給我一個錯誤,可能我必須使用一些庫。我試過用getchar()(只有我們學到的功能,看起來像我猜),它仍然給分割摺疊...:/ –

+0

這種「分析」是完全錯誤的,與無關崩潰的真正原因(和'getche()'是非標準的並且不推薦使用,通常並不需要)。 –

1
scanf("%d",&n); 

int s[n*2]; 

此代碼試圖掃描和讀取轉換後的矩陣無論是在輸入離開。如果輸入不是數字,比如輸入的字符多於矩陣應該包含的字母,轉換將失敗,並且n將保持未初始化。那麼int s[n*2];是不確定的,因爲n是不確定的。

如果你想忽略輸入中的一些字符,你需要明確地這樣做。您還最好檢查所有接受用戶輸入的函數的返回值,並驗證讀取的值是否合理。

+0

哦,我明白了這個問題...你能幫我解決這個問題嗎?忽略我輸入的所有字符?我認爲我已經限制了對於cicles。 –

+0

您的嵌套'for'循環完全讀取'nl * nc'非空白字符。如果你想要別的東西,請準確描述你想要的東西。你不能閱讀和忽略所有的字符,因爲你需要在某個點停止矩陣並開始處理'n'和其他所有內容。你需要能夠準確地描述那個點是什麼。 –

+0

我想要的是一種方法,只是刪除額外的字符,我輸入時讀數組,所以沒有任何信息緩衝區時,從輸入中讀取n ...這就是我想要的:) –