在这个问题陈述中,我们需要从用户那里得到一个数字数组,然后请求一个他们想要搜索的数字,并给出它的地址。我写了下面的代码,但是经常出错。
如何解决呢?
#include<stdio.h>
#include<conio.h>
int search(int ,int ,int );
main()
{
int i,a[i],target,*p,n;
pritnf("enter number of numbers u want");
scanf("%d",&n);
printf("enter numbers you want in array");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("enter the number u are searching");
scanf("%d",&target);
p=search(a,n,target);
if(p==NULL)
{
printf("target not found");
}
else
{
printf("target found at %d",p);
}
}
int search(int a[],int n,int target)
{
int i;
for(i=0;i<n;i++)
{
if(a[i]==target)
{
return &a[i];
}
}
}
错误:C:\用户\hp\桌面\无标题1.c|26|错误:"search"的类型冲突|
3条答案
按热度按时间mcdcgff01#
你的声明
不符合您的定义。因此出现错误。
要么修正这个问题,要么在
main()
之前定义函数,这样就不需要任何原型了。您还使用未定义的变量在
main()
中定义数组。i
的值是不确定的。请在读取输入后声明数组。sxpgvts32#
您将函数声明为
int search(int ,int ,int );
,带有 * 3个整型参数 *,但定义中提供了指向整型的指针(int a[]
等于int* a
)和 * 2个整型参数 *。函数声明应为
int search(int* ,int ,int );
但是,您的代码存在许多其他问题:
int main(void)
或int main(int argc, char **argv)
是一个很好的做法,使其返回一个整数值(通常0表示 * success *,正值或负值表示 * failure *)。What should main() return in C and C++?;printf()
拼写错误:"printnf",这会产生一个 * 隐式声明警告 *,并且由于一个名为printnf的函数没有在任何地方声明,编译失败;search()
的整数返回值赋给p
,p
是一个类型为"指向整数的指针"的变量,这会生成一个"隐式整数转换警告";a[i]
,而现在它返回的是&a[i]
,它是一个指向整数的指针,这也会产生一个"隐式整数转换警告";我建议您打开编译器警告,并特别注意它告诉您的内容,因为所有这些问题都可以通过查看它们来轻松避免。
vxf3dgd43#
让我们从头开始。
头文件
<conio.h>
不是一个标准的头文件,程序中也没有使用头文件的声明。可以被去除。
函数
search
是使用int
类型的三个参数声明的也就是说,它不接受数组。
函数的返回类型也是
int
,而不是指针类型。注意,函数不会改变传递的数组,所以函数声明如下所示
第二个参数指定传递的数组中的元素数,它的类型为无符号整数
size_t
,而不是有符号整数int
。也就是说,数组中的元素数不能为负值。因此,将此参数声明为有符号整数类型没有意义。此外,如果在数组中找不到目标元素,则函数不返回任何内容。
在本声明中
你声明了一个可变长度的数组
a[i]
。但是变量i
还没有初始化。所以这个声明是无效的并且会导致未定义的行为。此外,数组中元素的数量存储在变量
n
中:因此,您需要在变量
n
获得其值之后声明数组。在
printf
的调用中使用了带指针的无效转换说明符
%d
。这将调用未定义的行为。您至少需要使用转换说明符
%p
,而不是%d
。最后,函数
main
应具有返回类型int
。程序可以看起来像下面这样。