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

why is my code giving a run time error?

本文关键字:运行时错误 代码 我的 为什么      更新时间:2023-10-16

根据我的说法,代码很好。我试着逐行调试它,但出乎意料的是,这段代码给了我一个运行时错误,我不明白为什么这段代码会出现这样的错误。有人能检查一下我在这里使用的字符串函数吗?如果可能的话,请告诉我这个程序为什么会出现运行时错误?此代码的表意链接为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("men");
    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("men");
    }
  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);
}

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

以下是我发现的一些东西:

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

我想,如果我更仔细地看这一团糟,我可能会发现更多的错误。。。

while(f==0&&a[j][k]!='t')从来都不是真的(可能是,但不是在你的输入中——除非你有其他输入,而不是在你链接的网站上(

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

我在"模糊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;}

它相当安全(如果你输入了错误的输入tho’,就不会说太多,如果行比点画的长,就会做"奇怪"的事情(。我应该添加一个检查if(t>40(exit(1(;可能

请随意适当缩进,并尝试弄清楚它是如何工作的。;(