C程序将包含0值的行和列转换为零

时间:2015-08-05 17:45:25

标签: c matrix

#include<stdio.h>
#include<conio.h>
{
int mat[3][3]={{0,2,3},{4,9,5},{0,1,8}};
int i,j,c;
int x=0;


for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(mat[i][j]==0)
c++;
int col[c],row[c];
x=0;
for(i=0;i<3;i++)
{for(j=0;j<3;j++,x++)
{
    if(mat[i][j]==0)
    {
        col[x]=j;
        row[x]=i;
    }
}}
for(x=0;x<c;x++)
{
    for(j=0;j<3;j++)
    {
        mat[row[x]][j]=0;mat[j][col[x]]=0;
    }
}
for(i=0;i<3;i++)
{
    for(j=0;j<3;j++)
    {
        printf("%d\t",mat[i][j]);
    }
    printf("\n");
}
getch();
return 0;
}

我在上面的代码中做的是我存储零的位置并将其存储在数组中。 现在我使用这些位置将零值的行和列更改为零。 在执行时我遇到了分段错误。可能有人指出我的错误。

2 个答案:

答案 0 :(得分:1)

除了用于定义数组大小的未初始化c之外,您还需要在存储每对索引后递增x。从,x++循环语句中取出for,就会出现错误(因为您可能找不到0值。)

因此,无论是否将索引值写入数组,x都会递增。如果您不这样做,col[]row[]的这些数组元素都是未经授权的。因此,当您稍后使用它们进行索引时,您将使用未初始化的值来获取未定义的行为,这些值很可能超出了它们正在编制索引的数组。

请记住:您必须专门初始化所有局部变量。

答案 1 :(得分:0)

  1. 您需要将c初始化为0
  2. int i,j,c=0;
    
    1. 仅在找到0时递增x
    2. for(j=0;j<3;j++)
      {
      if(mat[i][j]==0)
      {
          col[x]=j;
          row[x]=i;
          x++;
      }
      }
      
      1. int main()缺失
      2. 虽然这不是最有效的解决方案,但上述更改应执行所需的任务。