为什么这个问题不重复?
问题可以在scanf
,因为它是由黑客提供的,我无法修改代码!此外,由hackerrank提供的测试用例是自动化的。我们可以通过输入阅读来信任他们。我的逻辑中有一些错误在数组中找到两个元素,但是找不到它:|
注意:我无法修改main
方法,如前所述。重新迭代它。为什么我不能修改?这是因为该方法是由门户网站给出的。我无法改变它。它读取输入并通过一些自动脚本调用我的方法,我无法控制它。所以,请不要告诉我修改main
方法。
我正在用C
语言尝试hackerrank中的一些练习问题,并且一些测试用例开始抛出Segmentation fault
以解决以下问题。我已经尝试了解它超过2个小时了,并且无法想到任何会抛出segmentation fault
的测试用例。我被卡住了:|
问题陈述:
很容易,对吧?我的想法一样,编码如下,给出一个数组和一个数字。查找数组中是否有2个元素,其总和等于给定数字。如果存在数字则返回1,否则返回0。
int compFunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int isSumPossible(int a[], int L, int N ){
/*L: Length of the array */
if(a==NULL) return 0;
if(L<=1) return 0;
int left=0, right=L-1;
qsort(a,L,sizeof(int),compFunc);
while(left<right)
{
if(a[left]+a[right]==N) return 1;
else if(a[left]+a[right]<N) left++;
else right--;
}
return 0;
}
int main() //given by hackerrank, I can't modify main method
{
int N; scanf("%d", &N); //fixed &N - it was correctly given in code, I missed it while typing it here.
int a[100004], i=0;
//read input into array a, based on N
int x;scanf("%d", &x); //fixed &x - it was correctly given in code, I missed it while typing it here.
printf("%d", isSumPossible(a,N,x));
}
请假设包含所有必需的头文件。现在,当我运行代码时,大多数测试用例都已通过,对于某些测试用例,他们显示Segmentation fault
。不幸的是,测试用例对我来说是不可见的:|。我已经完成了我的代码超过10次&amp;我不明白我会在哪种情况下Segmentaion fault
。任何人都可以帮助我了解我的代码中缺少哪种情况,为什么我会看到分段错误?
答案 0 :(得分:1)
问题出在代码主要部分的scanfs中。
如果查看文档,功能描述甚至会说:
从stdin读取数据并根据参数格式将它们存储到附加参数的位置指向中。
这意味着你必须给它一个内存地址来写入数据。通过将&
添加到主体中的两个整数变量,问题就解决了。
int main()
{
int N; scanf("%d", &N);
int a[100004], i=0;
//read input into array a, based on N
int x;scanf("%d", &x);
printf("%d", isSumPossible(a,N,x));
}