-5

根据我的说法,代码很好。我已经尝试逐行调试它,但出乎意料的是,这段代码给了我一个运行时错误,我无法理解为什么这段代码会出现这样的错误。有人可以通过我在这里使用的字符串函数,如果可能的话,请告诉我为什么这个程序会给出运行时错误?此代码的 ideone 链接是http://ideone.com/LyFTWu

#include<stdio.h>
#include<string.h>
using namespace std;

int main()
{
int t,i;
//printf("md");
scanf("%d",&t);
for(i=0;i<t;i++)
{
    int n,j,k,f,g=0;
    char a[50][57],c[50];
    //printf("me");
    scanf("%d",&n);
    //printf("%d",n);
    //m=getchar();
    //printf("me\n");
    getchar();
    for(j=0;j<n;j++)
    {
        k=0;

        while(1)
        {

            a[j][k]=getchar();
            //printf("%c",a[j][k]);
            if(a[j][k]=='\n') break;
            k++;
        }
        //printf("me\n");
    }
  for(j=n-1;j>=0;j--)
  {
  k=0;
  g=0;
    if(j==n-1)
    {

        printf("Begin ");
    }
    else if(a[j+1][0]=='L')
    {
        printf("Right ");
    }
    else if(a[j+1][0]=='R')
    {
        printf("Left ");
    }
        while(1)
        {

        while(a[j][k]!='o'&&g==0)
        {

            k++;
        }
        g=1;
        //printf("me");
        if(a[j][k]=='\n') break;
        printf("%c",a[j][k]);

        k++;


        }
    printf("\n");


  }
}
return(0);
}
4

4 回答 4

3

我看到的一件事是您在while(a[j][k])数组中访问 k==-1,这不是合法索引。

于 2012-12-23T18:20:53.820 回答
2

以下是我发现的几件事:

  1. 使用scanf()要求您检查它是否成功读取字段,使用例如scanf("%d", &n) == 1并适当地处理这两个结果。
  2. 如果50 <= n第一个循环访问的值超出了a[j][k].
  3. 如果线路长于57访问a[j][k]范围也超出范围。
  4. a[j][k]被访问的k == -1对象超出范围,这次在另一端。
  5. 如果行上没有字符,while则以开头的嵌套循环f == 0可以访问整个位置的超出范围的值。\t

我猜,如果我进一步注视这个烂摊子,我会发现更多错误......

于 2012-12-23T18:30:29.657 回答
1

while(f==0&&a[j][k]!='\t')从来都不是真的(嗯,可能是这样,但不是在您的输入中 - 除非您在链接到的网站上还有其他输入)

这显然是一个问题,因为您将超出缓冲区的末尾并继续前进,直到出现其他问题。

于 2012-12-23T18:32:06.330 回答
1

我的“混淆 C 竞赛”的工作条目(是的,我确信它可以变得更加混淆,我把它减少到 397 个字符,但决定使用这个变体,因为它更有趣地使用宏):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define L "Left"
#define R "Right"
void s(int*p){if(scanf("%d ",p)!=1)exit(1);}
#define c(a,c)if(!strncmp(a,r[i],c))
#define f(a,b,c)for(i=a;i b;i c##c)
int main(void){int t,n,i,o;char r[40][51],*x,*d;s(&t);while(t--){s(&n);
f(0,<n,+)fgets(r[i],50,stdin);d="Begin";f(n-1,>-1,-){o=5;c(L,4)o=4,x=R;
else c(R,5)x=L;printf("%s%s",d,r[i]+o);d=x;}puts("");}return 0;}

这是相当安全的(如果您输入错误的输入并不会说太多,并且如果线条比规定的长,则会做“奇怪”的事情)。我应该检查 if(t>40)exit(1); 也许。

随意正确缩进并尝试弄清楚它是如何工作的。;)

于 2012-12-23T20:40:19.773 回答