Я написал функцию, которая принимает две строки и возвращает обычные символы без двойников. Что с этим не так? - PullRequest
0 голосов
/ 01 августа 2020

У меня есть функция, которая принимает две строки и возвращает без двойников символы, которые появляются в обеих строках, в том порядке, в котором они появляются в первой. Вот моя реализация в C:

#include <string.h>
//Remove all char duplicates in string
//Sub function
char *removeAll(char* str,char c, int pos)
{
        int i,j;
        int len = strlen(str);

        for (i = pos+1;i<len;i++)
        {
            if (str[i] == c)
            {
                for (j=i;j<len;j++)
                {
                    str[j] = str[j+1];
                }
                len--;i--;
            }
        }
        return str;
}
//Finds all common chars and concatenate it to one string
//Sub function
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;   
}
/* The main function that takes two strings and return, without doubles, the
characters that appear in both strings, in the order they appear in the first
one.*/
char* inter(char* s1,char* s2)
{
    char* new_str,*new_str1;
    int len1 = strlen(s1),len2 = strlen(s2);
    for (int i = 0;i<len1;i++)
    {
        new_str = removeAll(s1, s1[i], i);
        len1 = len1-(len1-strlen(new_str));
        if (strcmp(new_str, s1) != 0) i = 0;
    }
    for (int j = 0;j<len2;j++)
    {
        new_str1 = removeAll(s2, s2[j], j);
        len2 = len2-(len2-strlen(new_str1));
        if (strcmp(new_str1, s2) != 0) j = 0;
    }
    char* res = commonString(new_str, new_str1);
    return res;
}

Это дает « FAILURE EXECUTION » Что не так с моим кодом? Можете ли вы помочь исправить это?

Примеры ввода-вывода:

Пример 00

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

Пример 01

> Input: "ddf6vewg64f" && "gtwthgdwthdwfteewhrtag6h4ffdhsd" 
> Output: 
> Return Value: "df6ewg4" 

Пример 02

> Input: "nothing" && "This sentence hides nothing"
> Output: 
> Return Value: "nothig"

1 Ответ

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

В вашем коде есть несколько проблем

Он дает "FAILURE EXECUTION" Что не так с моим кодом?

В commonString вы пытаетесь для изменения буквальной строки, которая по определению не может быть изменена, поэтому поведение не определено:

char* res = "";
...
strcat(res,&p1[k]);

Из этого removeAll всегда возвращает свой первый аргумент, поэтому в inter

new_str = removeAll(s1, s1[i], i);
...
if (new_str != s1) i=0;

и

new_str1 = removeAll(s2, s2[j], j);
...
if (strcmp(new_str1, s2) != 0) j = 0;

тесты всегда верны, даже если вы сравниваете указатели и, вероятно, хотите сравнить их содержимое, предполагая, что они могут быть разными (но, конечно, не могут). Чтобы сравнить содержимое двух строк, используйте strcmp

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