致命信号11退出状态

时间:2016-01-17 12:53:59

标签: c arrays string data-structures

该代码在一个在线评判中给出了致命的信号11状态,其中尝试了包括在main中的数组以及全局声明但没有用的随机测试用例。 我知道它的分段错误但无法调试它。它适用于较小的测试用例。

#include<stdlib.h>
#include<stdio.h>
char a[1101][1101];
int main()
{
    long long int t,m,n;
    scanf("%lld",&t);
    while(t--)
    {
        long long int count;
        count=0;
        scanf("%lld %lld",&m,&n);
        //char a[1001][1001];
        long long int l;
        for(l=0;l<m;l++)
        {
               scanf("%s",&a[l]);


        }
        long long int i,j,p=0,b[1101],d[1101],lolo=0,locale=1;
        while(locale==1)
        {
            for(i=0;i<m;i++)
            {   
                for(j=0;j<n;j++)
                {   
                    if(a[i][j]=='r')
                       {
                            b[p]=i;
                            d[p]=j;
                            p++;
                        }   
                }
            }
        //printf("%d\n",p);
            for(i=0;i<p;i++)
            {
             if(a[b[i]-1][d[i]]=='f' && b[i]>=1 && d[i]>=0)
                {   
                  a[b[i]-1][d[i]]='r';
                  lolo=1;
                }
              if(a[b[i]][d[i]+1]=='f' && d[i]<n-1)
              {
                  a[b[i]][d[i]+1]='r';
                  lolo=1;
              }
              if(a[b[i]][d[i]-1]=='f' && d[i]>0)
              {
                  a[b[i]][d[i]-1]='r';
                  lolo=1;
              }
              if(a[b[i]+1][d[i]]=='f' && b[i]<m-1)
              {
                  a[b[i]+1][d[i]]='r';
                  lolo=1;
              }
        }
            //printf("%d lol \n",lolo);
            for(i=0;i<p;i++)
            {
                b[i]=0;
                d[i]=0;
            }
            p=0;
            if(lolo==0)
            {
                for(i=0;i<m;i++)
                {
                    for(j=0;j<n;j++)
                    {
                        if(a[i][j]=='f')
                        {
                            count=-1;
                            locale=-1;
                        }
                    }
                }
                locale=-1;
            }
            count++;
            lolo=0;
        }
        printf("%lld\n",count-1);
        //printf("%d 00 \n",t);
        for(i=0;i<m;i++)
        {
           for(j=0;j<n;j++)
           {
               a[i][j]='\0';
           }
        }
    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

a是一个2D数组,您正在使用

行读取它
 scanf("%s",&a[l]);

如果您希望将每个字符串存储在不同的行中,则需要执行

 scanf("%s",a[l]);

由于它是一个二维数组,a[l]意味着它只被解除引用一次,并且它给出了每一行的起始地址。

答案 1 :(得分:0)

我可以在您的代码中发现一些错误,但可能会有更多错误我无法继续阅读,因为我很难跟进,因为您在代码中间声明变量并且您使用太少的空白区域,所以我无法分辨什么是变量,什么是表达式,这些都是明显的错误

  1. 您可以使用d未初始化,例如

    if (a[b[i] - 1][d[i]] == 'f' && b[i] >= 1 && d[i] >= 0)
    
  2. 您将指针的地址传递给scanf()此处

    scanf("%s", &a[l]);
    

    虽然a[l]&a[l]都是相同的地址,但它们的类型会有所不同,这会影响对它们执行的指针运算。

  3. 您始终忽略scanf()的返回值,阅读this manual page throughly并了解如何使用scanf()。即使你知道这一切,它仍然很难正确使用它,但它会帮助你避免一些错误。