为什么我的代码会出现运行时错误?

时间:2012-12-23 18:16:34

标签: c++

根据我的说法,代码很好。我已经尝试逐行调试它,并且意外地这段代码给了我一个运行时错误,我无法理解为什么这段代码给出了这样的错误。有人可以通过我在这里使用的字符串函数,请尽可能告诉我为什么这个程序给出运行时错误? 此代码的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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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循环可以访问整个地方的超出范围值。
  6. 我猜,如果我在这个烂摊子里凝视着,我会发现更多错误......

答案 2 :(得分:1)

while(f==0&&a[j][k]!='\t')永远不会是真的(好吧,它可能是,但不是在你的输入中 - 除非你有其他输入,而不是你链接到的网站)

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

答案 3 :(得分: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);也许。

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