Подборка уникальных персонажей - PullRequest
0 голосов
/ 23 апреля 2020

Пожалуйста, помогите с кодом.

Требование: Напишите функцию my_union, которая принимает две строки и возвращает без двойных символов символы, которые появляются в одной из строк.

Пример : Вход: "zpadinton" && "paqefwtdjetyiytjneytjoeyjnejeyj" Вывод: "zpadintoqefwjy"

Мой код:

#include <stdbool.h>
#include <stdio.h>
#include <string.h>

char *my_union(char *a, char *b) {
  char *str;
  // Algorithm for excluding nonunique characters from string a(given in
  // parameters).
  str[0] = a[0];
  int k = 1;
  str[k] = '\0';
  for (int i = 1; a[i] != '\0'; i++) {
    bool is = true;
    for (int j = 0; str[j] != '\0'; j++) {
      if (str[j] == a[i]) {
        is = false;
        break;
      }
    }
    if (is) {
      str[k] = a[i];
      k++;
      str[k] = '\0';
    }
  } // In this case we are  excluding excess character 'n' from "zpadinton", so
    // str is equal to "zpadinto".

  // Algorithm for adding unique characters from array b(given in parameters)
  // into str.
  for (int i = 0; b[i] != '\0'; i++) {
    bool is = true;
    for (int j = 0; str[j] != '\0'; j++) {
      if (str[j] == b[i]) {
        is = false;
        break;
      }
    }
    if (is) {
      strncat(str, &b[i], 1);
    }
  }
  return str;
}

Первый алгоритм почти идентичен второму, но он не работает (. Мб я перепутался с памятью, дайте совет, пожалуйста.

1 Ответ

1 голос
/ 23 апреля 2020

Если вы имеете в виду, получить уникальные символы из двух строк и сохранить их в новую строку, попробуйте этот код;

Сначала вы должны выделить память для str. В вашем коде str не указывает на выделенную область памяти, поэтому вы, вероятно, получите ошибку сегментации.

int contains(const char * str,char c)
{
    for (int i = 0; i < strlen(str); ++i)
        if(str[i] == c)
            return 1;

    return 0;
}

char * my_union(char *a, char*b)
{

    char * res = (char*)malloc(sizeof(char)*(strlen(a) + strlen(b)));

    int pushed = 0;

    for (int i = 0; i < strlen(a); ++i)
    {
        if(!contains(res,a[i])){
            res[pushed] = a[i];
            pushed++;
        }
    }

    for (int i = 0; i < strlen(b); ++i)
    {
        if(!contains(res,b[i])){
            res[pushed] = b[i];
            pushed++;
        }
    }

    return res;
}

int main(int argc, char const *argv[])
{

    char string1[9] = "abcdefgh";
    char string2[9] = "abegzygj";

    char * result = my_union(string1,string2);
    printf("%s\n", result);

    return 0;
}

Кроме того, не забудьте освободить возвращаемое значение my_union после того, как вы покончили с ним.

...