2014-04-19 28 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 ...这就是我想要的:) –