使用数组指针(C)时出现问题

  • 本文关键字:问题 数组 指针 c
  • 更新时间 :
  • 英文 :


我正在编写一个程序,该程序旨在读取两个数组,并找出两者之间的差异(元素在集合a中找到,但在集合B中找不到(。

集合使用1和0的数组存储(1表示存在的元素,0表示不存在的元素(。我写了以下代码,似乎不明白为什么我会收到这些警告

warning: comparison between pointer and integer [enabled by default]
if(p==1 && q==0)
^
warning: assignment makes pointer from integer without a cast [enabled by default]
set_difference = 1;

我写了以下代码。它也不会返回值。

#define N 10
void find_set_difference(int *set_a, int *set_b, int n, int *set_difference);  
int main(void)
{
int i, k;
int n;
printf("Enter the number of elements in set A: n");
scanf("%d", &n);

int a[n];
printf("Enter the elements in set A: n"); 
for(i=0; i<n; i++){
scanf("%d", &a[k]);
a[k] = 1;
}
printf("Enter the number of elements in set B: n");
scanf("%d", &n);
int b[n];
printf("Enter the elements in set B: n"); 
for(i=0; i<n; i++){
scanf("%d", &b[k]);
b[k] = 1;
}
int set_dif[N];
find_set_difference(a, b, N, set_dif);
printf("The difference of set A and set B is: n");
for(i=0;i<10;i++){
if(set_dif[i]==1)
printf("%d ",i);
}
return 0;
}
void find_set_difference(int *set_a, int *set_b, int n, int *set_difference){
int *p, *q;
for(p=set_a; p<set_a+n; p++){
for(q=set_b; q<set_b+n; q++){
if(p==1 && q==0)
set_difference = 1;
else 
set_difference = 0;
}
}
}

任何格式化和使用指针的帮助都会很有帮助,因为我对编码还很陌生,很难理解这些概念。

以下检查指针的值:

if(p==1 && q==0)

您要检查指向的值。

if(*p==1 && *q==0)

以下设置指针的值:

set_difference = 1;

您希望设置定点变量。

*set_difference = 1;

此答案仅针对您询问的警告。还有许多其他大问题,但我不想为你做家庭作业。想想你想设置多少不同的变量

  • 您当前正在设置一个
  • 您当前正在设置它n*n次

您的代码中存在一些问题:

  1. 变量k的值没有在循环中初始化,因为它被用作迭代器,而且a[k] = 1也没有生成任何值,因为这是一个数组而不是哈希表,假设如果是input1 = 1, 2, 3, 4, 5input2 = 6, 7, 8, 9, 10,那么写这行的方式会使input1与input2:

    for(i=0; i<n; i++){
    scanf("%d", &a[k]);
    a[k] = 1;
    }   
    

所以你应该这样做:

for(i=0, k = 0; i<n; i++, k++){
scanf("%d", &a[k]);
}

  1. 如果用户为两个不同的数组输入不同的大小,则对两个不同数组使用相同的变量n可能会导致一些错误

所以使用另一个变量来获得第二个数组的大小,而不是用于第一个数组的n


  1. 行中set_dif的大小:

    int set_dif[N];
    

最好是它们中最小数组的大小,但如果它的大小大于这个值,就不会有任何区别。


  1. 在行中:

    if(p==1 && q==0)
    

您正在比较作为指针p的地址和作为1的值

因此,您应该将该地址中的值与值1进行比较,因此您应该执行:if(*p==1 && *q==0)


  1. 在行中:

    set_difference = 1;
    

set_difference是指向数组的指针,这意味着它是一个地址,因此不能执行address=Value,而应该执行:

set_difference[i] = 1;

其中i是迭代器


  1. 也在行中:

    if(*p==1 && *q==0)
    

您应该比较if(*p!=*q),以免出现第1点中讨论的问题并且被称为CCD_ 15的阵列应该被初始化为1。


  1. 而不是:

    printf("%d ",i); 
    

write:printf("%d ",a[i]);,为了用这一行实现搜索,您应该寻找一种叫做哈希表的东西


尽管如此,这是完整的编辑代码:

#include <stdio.h>

void find_set_difference(int *set_a, int *set_b, int n, int m, int *set_difference);
int main(void)
{
int i, k = 0;
int n, m;
printf("Enter the number of elements in set A: n");
scanf(" %d", &n);
int a[n];
printf("Enter the elements in set A: n");
for(i=0, k = 0; i<n; i++, k++){
scanf(" %d", &a[k]);
}
printf("Enter the number of elements in set B: n");
scanf("%d", &m);
int b[m];
printf("Enter the elements in set B: n");
for(i=0, k = 0; i<n; i++, k++){
scanf("%d", &b[k]);
}
int set_dif[n];
for (int j = 0; j < n; ++j) {
set_dif[j] = 1;
}
find_set_difference(a, b, n, m, set_dif);
printf("The difference of set A and set B is: n");
for(i=0; i< n ;i++){
if(set_dif[i] != 0)
printf("%d t",a[i]);
}
return 0;
}
void find_set_difference(int *set_a, int *set_b, int n, int m, int *set_difference){
int *p, *q;
int i = 0;
for(p = set_a; p < set_a + n; p++, i++){
for(q = set_b; q< set_b + m ; q++){
if(*p==*q)
set_difference[i] = 0;
}
}
}

这是一些示例输出:

Enter the number of elements in set A:
5
Enter the elements in set A:
1
3
4
5
6
Enter the number of elements in set B:
5
Enter the elements in set B:
2
3
4
6
8
The difference of set A and set B is:
1       5

最新更新