来自此代码,
node[4] = {5,3,2,6};
neighbor[4] = {4,7,8,9};
我必须找到,
node[0]
和node[1]
具有来自neighbor[0-3]
node[1]
和node[2]
具有neighbor[0-3]
node[2]
和节点[3]具有neighbor[0-3]
如果有人满足打印元素,则不是......左右 我试过这段代码,但是有错误状态分段错误。
#include<stdio.h>
int main()
{
int node[4] = {5,3,2,6};
int neighbor[4] = {4,3,2,9};
int sub,i,flag=0,k=0;
for (k=0;k<3;k++){
for (i = 0; i < 4; i++) {
if (node[k]==neighbor[i])
flag=1;
break;
}
}
if (flag==1)
sub=k+1;
for (i = 0; i < 4; i++) {
if (node[sub]==neighbor[i])
flag=2;
break;
}
if (flag==2)
printf("Element not found\n");
else
printf("Element found\n");
}
答案 0 :(得分:3)
您正在访问数组的界限。
sub=k+1;
使用此功能,将k设置为4,然后在后续循环中访问node[sub]
。只有0到3是node
的有效索引。
访问越界内存是未定义的行为。你可能想要摆脱两个循环。
for (k=0;k<3;k++){
for (i = 0; i < 4; i++) {
if (node[k]==neighbor[i])
{
flag=1;
break;
}
if (flag == 1) break;
}
}
if (flag==1) {
sub=k+1;
for (i = 0; i < 4 && sub < 4; i++)
{
if (node[sub]==neighbor[i])
{
flag=2;
break;
}
}
}
注意for循环中的条件:sub < 4
以确保您不会访问越界。
#include<stdio.h>
int present(int x, int y, int N[])
{
int i, c=0;
for(i=0;i<4;i++)
{
if(N[i]==x) c++;
if(N[i]==y) c++;
}
if (c==2) return 1;
return 0;
}
int main()
{
int node[4] = {5,3,2,6};
int neighbor[4] = {4,8,2,9};
int sub,i,flag=0,k=0;
for (k=0;k<3;k++){
if (present(node[k], node[k+1], neighbor)) {
flag = 1;
printf("Element found");
break;
}
}
if(flag == 0)
printf("Element not found");
return 0;
}
答案 1 :(得分:1)
sub
未定义/未设置,以防flag
永远不会设置为1
,因此您基本上使用未初始化的值作为索引,从而导致您的程序从它指向的任何地方。
答案 2 :(得分:0)
以下是完整的解决方案:
#include <stdio.h>
int main()
{
int node[4] = {5,3,2,6};
int neighbor[4] = {4,3,2,9};
int i=0,j=0,k=0;
for (i=0; i<4; i++) {
for (j=0; j<4; j++) {
if (node[i]==neighbor[j]) {
for (k=0; k<4; k++) {
if (node[i+1]==neighbor[k]) {
printf("Element found: %d %d\n", node[i], node[i+1]);
return 0;
}
}
}
}
}
printf("Element not found\n");
return 0;
}