Что не так с моей функцией? У меня есть функция, которая находит все общие символы и объединяет их в одну строку - PullRequest
1 голос
/ 01 августа 2020

У меня есть функция, которая находит все общие символы и объединяет их в одну строку.

char* commonString(char* p1,char* p2)
{
    char* res = "";
    for (int k=0;k<strlen(p1);k++)
    {
        for (int h=0;h<strlen(p2);h++)
        {
            if (p1[k] == p2[h])
            {
                strcat(res,&p1[k]);
            }
        }
    }
    return res;   
}

Что с этим не так? Можете ли вы просмотреть и помочь исправить это?

Пример ввода / вывода: Пример 00

Input: "padinton" && "paqefwtdjetyiytjneytjoeyjnejeyj"
Output: 
Return Value: "padinto"

PS У меня также есть функция, которая удаляет все повторяющиеся символы, кроме первого его появления из строк . Эта функция работает после их удаления

Ответы [ 3 ]

0 голосов
/ 01 августа 2020

Вот такое решение:

#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 512

void removeDup(char *result, char *string)
{
  for (int i = 0; i < strlen(string); i++)
  {
    char C[2] = { string[i], '\0' };

    if (strstr(result, C) == NULL)
      strcat(result, C);
  }
}

char *commonString(char *p1, char *p2)
{
  char r[MAX_LENGTH] = { };

  for (int i = 0; i < strlen(p1); i++)                                                                                                                                                                             
    for (int j = 0; j < strlen(p2); j++)
      if (p1[i] == p2[j])
        strcat(r, &p1[i]);

  static char res[MAX_LENGTH] = { };
  removeDup(res, r);
  return res;
}

int main()
{
  printf("%s\n", commonString("padinton", "paqefwtdjetyiytjneytjoeyjnejeyj"));
  return 0;
}


$ cc string.c -o string && ./string
padinto
0 голосов
/ 02 августа 2020

Две основные проблемы в вашем коде состоят в том, что вы не выделяете место для результирующей строки и неправильно используете функцию strcat. Ниже приводится краткая реализация того, чего вы пытаетесь достичь.

#include <stdlib.h>
#include <string.h>

char *commonString(char* p1,char* p2)
{
    const size_t lenp1 = strlen(p1);
    char *res = malloc(lenp1 + 1);
    size_t j = 0;
    for (size_t i = 0; i < lenp1; ++i)
        if (strchr(p2, p1[i]))
            res[j++] = p1[i];
    res[j] = 0;
    return res;
}

Важное примечание: Указатель, возвращаемый функцией malloc, должен быть проверен на NULL перед разыменованием . Здесь для краткости он опущен.

0 голосов
/ 01 августа 2020

В вашем коде так много проблем.

  1. Не выделяется память,
  2. Изменение строковых литералов
  3. возвращает локальные переменные и c и c. Ваша функция также неэффективна. Вы вызываете strlen на каждой итерации, вызываете strcat (что очень дорого) просто для добавления 1 символа.

Эта функция делает то, что вы хотите, с дубликатами или без них.

#include <stdlib.h>
#include <stdio.h>

char *mystrnchr(const char *str, const char ch, size_t size)
{
    char *result = NULL;
    while(size--)
    {
        if(*str == ch)
        {
            result = (char *)str;
            break;
        }
        str++;
    }
    return result;
}

char *mystrchr(const char *str, const char ch)
{
    char *result = NULL;
    while(*str)
    {
        if(*str == ch)
        {
            result = (char *)str;
            break;
        }
        str++;
    }
    return result;
}


char* commonString(char *buff, const char* p1, const char* p2, int duplicates)
{
    size_t size = 0;
    char p1c;
    while((p1c = *p1++))
    {
        if(!duplicates)
        {
            if(mystrnchr(buff, p1c, size))
            {
                continue;
            }
        }
        if(mystrchr(p2, p1c))
        {
            buff[size++] = p1c;
        }
    }
    buff[size] = 0;
    return buff;   
}


int main()
{
    char result[23];
    char *str1 = "paaaadiiiiinton";
    char *str2 = "paqefwtdjetyiytjneytjoeyjnejeyj";

    printf("%s\n", commonString(result, str1, str2, 0));
    printf("%s\n", commonString(result, str1, str2, 1));
}

Вы можете сами поэкспериментировать здесь: https://godbolt.org/z/qMnsfa

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...