C++ 为什么我的代码会出现运行时错误?
根据我的说法,代码本身是很好的。我试着逐行调试它,但出乎意料的是,这段代码给了我一个运行时错误,我一直无法理解为什么这段代码会出现这样的错误。有没有人可以检查一下我在这里使用的字符串函数,如果可能的话,请告诉我为什么这个程序会出现运行时错误? 此代码的ideone链接为C++ 为什么我的代码会出现运行时错误?,c++,C++,根据我的说法,代码本身是很好的。我试着逐行调试它,但出乎意料的是,这段代码给了我一个运行时错误,我一直无法理解为什么这段代码会出现这样的错误。有没有人可以检查一下我在这里使用的字符串函数,如果可能的话,请告诉我为什么这个程序会出现运行时错误? 此代码的ideone链接为 #包括 #包括 使用名称空间std; int main() { int t,i; //printf(“md”); scanf(“%d”、&t); 对于(i=0;i我看到的一件事是,您在中访问,而(a[j][k])具有k=-1的数
#包括
#包括
使用名称空间std;
int main()
{
int t,i;
//printf(“md”);
scanf(“%d”、&t);
对于(i=0;i我看到的一件事是,您在中访问,而(a[j][k])
具有k=-1的数组,该数组不是合法索引。以下是我发现的几件事:
使用scanf()
如果50while(f==0&&a[j][k]!='\t')
从来都不是真的(当然,它可能是真的,但不在您的输入中-除非您在链接的站点上有其他输入)
这显然是一个问题,因为您将溢出缓冲区的末尾并继续运行,直到出现其他错误。我的“模糊C竞争”工作条目(是的,我确信它可以变得更模糊,我将其减少到397个字符,但决定使用此变体,因为它可以更有趣地使用宏):
#包括
#包括
#包括
#定义L“左”
#定义R“正确”
void s(int*p){如果(scanf(“%d”,p)!=1)退出(1);}
#如果(!strncmp(a,r[i],c))定义c(a,c)
#将f(a,b,c)定义为(i=a;i b;i c#c)
intmain(void){intt,n,i,o;charr[40][51],*x,*d;s(&t);而(t--){s(&n);
f(0,-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;}put(“”;}返回0;}
它是相当安全的(如果输入错误的输入tho'就不会说太多,如果行的长度超过stipulared,它会做“奇怪”的事情)。我应该添加一个检查,检查是否(t>40)退出(1);也许
可以正确地缩进并尝试找出它是如何工作的。)< /p>错误是什么?它在哪里?它确切地给出运行时错误,以及你看到的运行时错误是什么?这个代码看起来也是C而不是C++。“按照我的代码是这样的。”-好吧,我想这就解决了。如果你能说服你的计算机。在这个链接上看到输入,嗯。我现在已经第四次运行它了,它没有崩溃。但我不知道它想做什么。也许它会化身为圣诞老人,但我不知道输入哪些参数。好吧,你肯定是对的,但真正的pr问题是我从代码中测试的输入中复制了输入,当复制输入时,你在输入中没有得到返回,这造成了一个问题,我现在得到了。参考这个ideone链接,仍然面临相同的问题………嗯,我粘贴了输入(与道路一起)到你的程序的stdin。它很高兴地消化了它,但想阅读更多。现在查看此链接…….稍作修改后,我本来希望有一个输出,但我们会看到它…..哈哈,我已经在gdb中运行了这个东西。它被困在循环
中,而(f==0&&a[j][k]!='\t'{c[k]=a[j][k];k++}
,并且很高兴地增加了k,但我认为通过访问超出范围的c,在某个点上它会覆盖k,因此(至少对我的编译器来说)在一个奇怪的无休止的循环中,范围问题不应该在那里,因为我已经考虑到了输入的范围。……编程的第一规则:用户将努力试图超过你。即使友好的用户不这样做,敌对的用户也会滥用任何缓冲区溢出。不检查数组超量是主要的攻击向量。或者当然可以,但一定要参考我在ideone链接中给出的输入。这个输入不应该是问题。索引k==-1
肯定是错误的!没有必要参考这个链接,因为表达式a[j][k]
withk==-1
将无条件执行。如果您觉得需要分析其他代码,则需要更新您的问题,因为它们是自包含的。作为[j][k],这将是正确的正在存储字符,当空格字符在第一个单词后第一次出现时,它将为真…如果我错了,请纠正我…'\t'
不是“空格”.这是一个制表符。我试过你的代码,对这一行做了一点小改动,它工作得更好-虽然不完美,但要好得多。我不明白为什么它不完美,因为我不太喜欢花几个小时对使用单字符变量名且格式相当糟糕的代码进行排序。试着用事实上,这意味着更容易理解代码。并且在每行声明一个变量。磁盘空间现在并不那么昂贵。我非常感谢你的努力,但我编写这段代码是为了一个简短的编码竞赛,所以没有生成任何有意义的更长的变量名,如果你能简要解释一下在t他的密码我将非常感激……如果你在一个“最短的密码”竞争,然后使用长名称编写代码,然后在代码运行后将其缩短-至少如果您计划向不在同一竞争中的随机人员征求建议的话。对不起,您的代码太乱,无法阅读-并且您也收到了其他类似的注释。您指出的一件事\t是针对tab,但随后w那个帽子是用来做空格键的?
#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);
}
#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;}