Перезапись массива char с использованием указателей - PullRequest
0 голосов
/ 24 июня 2018

Мне нужно переписать массив символов, но отфильтровывать символы, которые мне не нужны.Например, массив: «abcdefgabcdefg», фильтр «abc», результат: «abcabc».Мне нужно использовать указатели.До сих пор я придумал это без какого-либо успеха:

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

char * function(char *d, char *z, char *filter){
    int x = strlen(z) + 1; int y = strlen(filter) + 1; bool b = false;
    for( ; *z ; z++, d++){
        for( ; *filter ; filter++){
            if(*z == *filter)
                b = true;
        }
        if(b)
            *d=*z;
        b = false;
        filter-=y;
    }
    return d;
}

int main(){
    char d[80];
    cout << function(d, "abbccddeeefa", "abd");
    return EXIT_SUCCESS;
}

1 Ответ

0 голосов
/ 24 июня 2018

Вы неправильно управляете указателями.

Вы увеличиваете выходной указатель независимо от того, пишете ли вы в него что-либо.

И вы слишком сильно уменьшаете указатель фильтра, когда пытаетесь вернуть его к первому символу после зацикливания на нулевом терминаторе.

И совсем не нужно тратить время и вычислительные мощности, чтобы звонить strlen().

Попробуйте вместо этого что-нибудь более похожее:

#include <iostream>
using namespace std;

char* function(char *buffer, const char *str, const char *filter) {
    char *b = buffer;
    for (; *str; ++str) {
        char ch = *str;
        for(const char *f = filter; *f; ++f) {
            if (ch == *f) {
                *b++ = ch;
                break;
            }
        }
    }
    *b = '\0';
    return buffer;
}

int main(){
    char d[80];
    cout << function(d, "abbccddeeefa", "abd");
    return EXIT_SUCCESS;
}
...