Есть несколько проблем:
Условия в двух циклах for
нечетны и, вероятно, неверны. Они эквивалентны:
for (i = 0; i < str1[i]; i++)
for (j = 0; j < str2[j]; j++)
Вероятно, вы должны указать размеры входных массивов в интерфейсе функции.
- В C вы должны всегда знать размеры массивов.
- Вероятно, вы должны указать выходной массив в интерфейсе функции.
- Поскольку вам нужно будет узнать, сколько значений было найдено совместно, вам нужно будет вернуть это число из функции.
- Ваш выбор имен
str1
и str2
необычен. Не технически неправильно, но, вероятно, не очень хорошая идея. Такие имена должны быть зарезервированы для символьных строк, а не массивов целых чисел.
- Ваш локальный массив
c
почти не используется и не используется безопасно.
- Ваш код возвращается, когда находит первую пару совпадающих чисел, а не все возможные совпадения.
- Первые две строки тела оператора
if
тщательно копируют значение в str[i]
обратно в себя через temp
.
- Третья строка тела оператора
if
копирует неинициализированное значение из массива c
в переменную temp
.
- Последняя строка тела
if
возвращает это неинициализированное значение.
Это добавляет к таким изменениям, как:
int func1(int *arr1, int num1, int *arr2, int num2, int *arr3)
{
int k = 0;
for (int i = 0; i < num1; i++)
{
for (int j = 0; j < num2; j++)
{
if (arr1[i] == arr2[j])
arr3[k++] = arr1[i];
}
}
return k;
}
Обратите внимание, что в этом коде предполагается, что размер arr3
(массив, а не сам указатель) такой же большой, как произведение num1
и num2
. Если оба массива содержат список с одним и тем же значением, то в выходном массиве будет одна строка arr3
для каждой пары, поэтому он может использовать num1 * num2
строк. Это указывает на то, что код не имеет дело с подавлением дубликатов; если вам это нужно (скорее всего), тогда в теле оператора if
необходимо выполнить поиск текущих значений в arr3
, чтобы убедиться, что новое значение отсутствует. Было бы целесообразно добавить еще один параметр, int siz3
, чтобы указать размер третьего массива; если вам не хватит места для значений, вы можете вернуть -1 в качестве индикации ошибки.
Кодированный алгоритм является квадратичным (или, точнее, пропорциональным произведению num1 * num2
). Если вы знаете, что массивы сортируются при входе, вы можете уменьшить его до линейного алгоритма (пропорционального num1 + num2
). С удалением дубликатов, это немного дороже - это не так просто, как «кубический». Если вы знаете, что входные массивы содержат уникальные значения (без дубликатов), удаление дубликатов, очевидно, не требуется.