Проверка одного массива на наличие элементов другого - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Необходимо проверить один массив на наличие другого в нём. То есть проверить есть ли в массиве А элементы массива B и вывести их на экран. Элементы не обязательно должны быть с одинаковыми индексами. Вот мой код. На строке if (A[i] == B[j]) программа вылетает и выдает ошибку: Вызвано исключение: нарушение доступа для чтения. B было 0xE14000.
#include "stdafx.h"
#include "stdio.h"
#include <malloc.h>
#include <windows.h>
#include <locale.h>
 
int main()
{
    setlocale(LC_ALL, "RUS");
    int B[] = { 23470 };
    const int n=10;
    int A[n];
    int i = 1, j, N;
 
    //создание и ввод массива
    printf("Введите символы массива А   \n");
    for (i = 0; i < n; i++)
    {
        scanf_s("%d", &A[i]);
    }
 
    //вывод цифр
    printf("Цифры:    ");
    for (i = 0; i < n; i++)
    {
        for (j = 0; i < n; j++)
        {
            if (A[i] == B[j])
                printf("%d", A[n]);
        }
    }
 
    system("pause");
    return 0;
}

Решение задачи: «Проверка одного массива на наличие элементов другого»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <stdbool.h>
 
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))
 
void findSubArray(const int* arr1, const unsigned n1, const int* arr2, const unsigned n2)
{
    bool flag = 0;
    unsigned i, j;
    putchar('\n');
    for (i = 0; i < n1; ++i)
        for (j = 0; j < n2; ++j)
            if (arr1[i] == arr2[j])
                flag = 1, printf("%i ", arr1[i]);
    flag ? puts("") : puts("Значений не найдено");
}
 
int main()
{
    setlocale(LC_ALL, "");
    puts("Введите размеры обоих массивов через пробел.");
    unsigned n1, n2;
    scanf("%u%u", &n1, &n2);
 
    int arr1[n1], arr2[n2], i, m, *ptr = n1 > n2 ? arr1 : arr2;
    for (i = 0, m = min(n1, n2); i < m; ++i)
    {
        printf("%s%u%s\n",
               "Введите значение ", i, "-го элемента обоих массивов через пробел.");
        scanf("%i%i", arr1 + i, arr2 + i);
    }
    for (ptr += i, m = max(n1, n2); i < m; ++i, ++ptr)
    {
        printf("%s%u%s\n",
               "Введите значение ", i, "-го элемента оставшегося массива (без пробела).");
        scanf("%i", ptr);
    }
    findSubArray(arr1, n1, arr2, n2);
    return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы
  2. Определяем пользовательские функции для нахождения минимума и максимума
  3. Создаем функцию для поиска подмассива в одном массиве
  4. В функции main устанавливаем локальную переменную для вывода
  5. Запрашиваем у пользователя размеры обоих массивов
  6. Создаем два массива и присваиваем им значения через scanf
  7. Если размер первого массива больше второго, то второй массив выделяем под первый
  8. Проходим по обоим массивам и запрашиваем у пользователя значения элементов
  9. Если размер первого массива больше второго, то после ввода всех значений второго массива, запрашиваем значение для оставшегося элемента первого массива
  10. Вызываем функцию findSubArray для поиска подмассива
  11. Возвращаем 0, чтобы указать, что программа успешно завершилась

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы