-5

私によると、コード自体は問題ありません。私はそれを1行ずつデバッグしようとしましたが、予期せずこのコードによって実行時エラーが発生し、このコードによってこのようなエラーが発生する理由を理解できませんでした。私がここで使用した文字列関数を誰かが調べてもらえますか?可能であれば、このプログラムで実行時エラーが発生する理由を教えてください。このコードの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

私が見ていることの1つは、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

「難読化された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 に答える
1

while(f==0&&a[j][k]!='\t')決して真実ではありません(まあ、そうかもしれませんが、あなたの入力にはありません-あなたがリンクしたサイト以外の入力がない限り)

これは明らかに問題です。バッファの終わりをオーバーランし、他の問題が発生するまで続行するからです。

于 2012-12-23T18:32:06.330 に答える