This question already has answers here:
segmentation fault using scanf with integer
(2个答案)
4年前关闭。
为什么这个问题不是重复的?
问题不可能出在
注意:如前所述,我无法修改
我正在尝试使用
问题陈述:
给定一个数组和一个数字。查找数组中是否有2个元素,其总和等于给定的数字。如果存在数字,则返回1,否则返回0。
很简单吧?我也这么认为,并编码如下,
请假定所有必需的头文件都包含在内。现在,当我运行代码时,大多数测试用例都通过了,对于某些测试用例,它们显示为
(2个答案)
4年前关闭。
为什么这个问题不是重复的?
问题不可能出在
scanf
上,因为它是由hackerrank给出的,我无法修改代码!另外,由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多次代码,而且我不知道在哪种情况下会得到Segmentaion fault
。谁能帮助我了解我的代码中缺少哪种情况,为什么我看到分段错误? 最佳答案
问题出在代码主要部分的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));
}
10-08 05:07