我试图从两个大小相同的未排序数组中找到共同元素....
我无法将预期的元素作为输出。我的代码有什么问题。
#include<stdio.h>
#include<stdlib.h>
int f=0, k=0;
int arr[10];
int main()
{
int *a,*a1,n,i,c;
printf("enter no of elements in arrays ");
scanf("%d", &n);
a = (int *)malloc(sizeof(int *)*n);
a1 = (int *)malloc(sizeof(int *)*n);
printf("enter elements 1st array\n");
for(i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
printf("enter elements 2nd array\n");
for(i=1; i<=n; i++)
{
scanf("%d", &a1[i]);
}
commonelefind(a,a1,n);
if(k == 0)
{
printf("there is no common element");
}
else
{
printf("common elements are");
while(k!=0)
{
printf("%d\n", arr[k]);
k--;
}
}
}
commonelefind(int *a, int *a1, int n)
{
int i,j,ele;
for(i=1;i<=n;i++)
{
ele = a[i];
for(j=1;j<=n;j++)
{
if (ele == a1[j])
{
k++;
arr[k] = ele;
}
}
}
return *arr,k;
}
最佳答案
您的程序中存在多个错误。评论者已经解决了一些问题。
在 C 中,数组索引从 0 开始。索引的范围用包含的下限和不包含的上限表示。如果您有一个 n
元素数组,则 n
不是有效索引;超出有效范围。最后一个元素的索引是 n - 1
。
这个约定意味着典型的 for
lopp 看起来像这样:
for (int i = 0; i < n; i++) ...
看到起始索引为 1 或条件中的小于或等于符号应该让您警惕。 (这样的构造不一定是假的,但是当你坚持通常的 C 命名法时,它们是不寻常的。)
这也意味着当你向后遍历一个数组并从数组长度 n
开始时,你必须在使用它之前递减你的索引,因为 n
本身是' 一个有效的索引。因此,向后打印 arr
元素的循环应该是:
while (k != 0) printf("%d\n", arr[--k]);
或者,也许更好:
while (k-- > 0) printf("%d\n", arr[k]);
(后一种变体可能更好,因为在这里,k` 在整个循环体中持有一个有效索引。这并不重要,循环体只是一个语句,但对于较大的循环更可取。)
将元素附加到数组的逻辑相同:您使用旧索引访问元素,然后增加到新长度:
arr[k++] = a[i];
因为 (yadda, yadda) 新长度 k
超出了(当前有效的)数组范围的范围。
您先调用该函数,然后再定义它。这意味着编译器确实#T 知道它的签名并从使用的参数中派生出一个。这不是一个好的做法。在使用之前声明一个函数原型(prototype):
void commonelefind(int *a, int *a1, int n);
我已经将函数设置为 void
,因为您实际上并没有返回任何东西;结果存储在全局变量中。这不是一个好的设计,但它适用于小程序。您的返回声明:
return *arr, k;
可能不是您想要的:它返回 k
,即逗号运算符的右侧。 *arr
被评估,但没有效果。不要在这里返回任何东西。
最后,在打印内容时要更加小心:字符串末尾应该有一个换行符,这样结果和消息就不会混在一起。
这是一个带有硬编码数组的更正变体。如果元素在一个数组中出现不止一次,它仍然会多次考虑元素。 (这使得 arr
的维度太小,因为在最坏的情况下,两个数组由相同的重复元素组成,你有 n*n
命中),但我保留了作为练习:
#include <stdio.h>
#include <stdlib.h>
void commonelefind(int *a, int *a1, int n);
int f = 0, k = 0;
int arr[10];
int main()
{
int a[] = {3, 4, 1, 6, 7, 8, 3, 4, 5};
int b[] = {2, 4, 6, 8, 10, 12, 14, 16, 18};
int n = 9;
commonelefind(a, b, n);
if (k == 0) {
printf("there is no common element\n");
} else {
printf("common elements are\n");
while (k-- > 0) {
printf("%d\n", arr[k]);
}
}
return 0;
}
void commonelefind(int *a, int *b, int n)
{
int i, j;
k = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (a[i] == b[j]) {
arr[k++] = a[i];
}
}
}
}
关于c - 打印两个数组中的公共(public)元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35810676/