根据我的说法,代码很好。我已经尝试逐行调试它,并且意外地这段代码给了我一个运行时错误,我无法理解为什么这段代码给出了这样的错误。有人可以通过我在这里使用的字符串函数,请尽可能告诉我为什么这个程序给出运行时错误? 此代码的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);
}
答案 0 :(得分:3)
我看到的一件事是您使用k == - 1访问while(a[j][k])
数组,这不是合法索引。
答案 1 :(得分:2)
以下是我发现的一些事情:
scanf()
要求您检查是否已成功阅读字段,例如使用scanf("%d", &n) == 1
并合理处理这两个结果。50 <= n
第一次循环访问的值超出a[j][k]
的范围。57
,则a[j][k]
的访问权限也会超出范围。a[j][k]
的访问权限为k == -1
,超出范围,此时为另一端。while
字符,则以f == 0
开头的嵌套\t
循环可以访问整个地方的超出范围值。我猜,如果我在这个烂摊子里凝视着,我会发现更多错误......
答案 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);也许。
随意缩进并尝试弄清楚它是如何工作的。 ;)