C манипуляции со строкой для удаления xx: xx: xx: xx: xx: xx - PullRequest
1 голос
/ 05 мая 2020

У меня проблема с удалением подстроки xx:xx:xx:xx:xx:xx из одной основной строки. Вот справочная информация о проблеме:

в функции void funA():

void funA(const char* sth){
 if (sth == THINGA){
      // do A;
    }
 else if (sth == THINGB){
      // do B;
    }
eles{
      // do C;
    }
 log_status("current status: - %s", sth);
}

sth - это строка, содержащая подстроку в формате xx:xx:xx:xx:xx:xx, где x либо число или букву. Перед подстрокой есть пробел, но его может не быть в конце строки. Мне нужно обфускировать эту подстроку с помощью *. Поскольку только подстрока имеет :, я создал вспомогательную функцию, чтобы найти первый : и последний : и удалить 2 символа перед ним. Удалите последние 2 символа и добавьте *. Я считаю, что это лучшее решение. Поэтому мне интересно, есть ли более эффективный дизайн вспомогательной функции, также известной как вспомогательная функция, с более коротким временем выполнения и меньшим объемом памяти. Поскольку подстрока xx: xx: xx: xx: xx: xx имеет очень различающийся формат guish, единственный более простой способ, который я могу придумать, - это сопоставить строку, чтобы найти подстроку, а затем заменить ее на *. Однако я открыт для другого, более инновационного пути.

Ответы [ 2 ]

0 голосов
/ 18 мая 2020
#ifndef PARSER_STACK_H_INCLUDED
#define PARSER_STACK_H_INCLUDED


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

#define PATTERN_LEN 18


typedef struct{
    unsigned int start;
    unsigned int finish;
}index;

void remove_str_pattern(char *original, char *extract, unsigned int start, unsigned int finish);
void splitter(char *x, index *index_SF);
unsigned int count_points(const char *x);
void obscure(char *str, index index_SF);
char* return_obscure_string(char *str);
char* return_pattern(char *str);

char* return_pattern(char *str){
    index index_SF = {0,0};

    char *str_export = calloc(PATTERN_LEN, sizeof(char));
    char *tmp = calloc(sizeof(str)/sizeof(char), sizeof(char));

    strcpy(tmp, str);

    splitter(str, &index_SF);

    obscure(tmp, index_SF);
    remove_str_pattern(str, str_export, index_SF.start, index_SF.finish);

    return str_export;
}

char* return_obscure_string(char *str){
    index index_SF = {0,0};

    char *str_export = calloc(PATTERN_LEN, sizeof(char));
    char *tmp = calloc(sizeof(str)/sizeof(char), sizeof(char));

    strcpy(tmp, str);

    splitter(str, &index_SF);

    obscure(tmp, index_SF);
    remove_str_pattern(str, str_export, index_SF.start, index_SF.finish);

    return tmp;
}

void obscure(char *str, index index_SF){
   for(unsigned int i = index_SF.start; i < index_SF.finish+1; ++i){
        if(str[i] != ':'){
            str[i] = '*';
        }
    }
}

void splitter(char *x, index *index_SF){
    for(unsigned int i = 0, tmp = 0; i < strlen(x); ++i){
        if(x[i] == ':'){
            ++tmp;
            if(tmp == 1){
                index_SF->start = i-2;
            }else{
                if(tmp == 5){
                    index_SF->finish = i+2;
                }
            }
        }
    }
}

unsigned int count_points(const char *x){
    int c = 1;

    for(unsigned int i = 0; i < strlen(x); ++i){
        if((x[i] == ':' && x[i+2] == ':') || (x[i] == ':' && x[i-2] == ':')){
            ++c;
        }
    }
    return c;
}

void remove_str_pattern(char *original, char *extract, unsigned int start, unsigned int finish){
    for(unsigned int i = start, j = 0; i < finish+1; ++i, ++j){
        extract[j] = original[i];
    }
}

#endif // PARSER_STACK_H_INCLUDED

Это мой личный заголовочный файл для вашего запроса, создайте заголовочный файл с этим кодом и попробуйте! : D Две "основные" функции этого файла есть. 1. char * return_obscure_string (char * str); Для возврата исходной строки с скрытой подстрокой ..

2. char * return_pattern (char * str); Для значения шаблона возврата из строки ..

Удачи!

0 голосов
/ 05 мая 2020
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define PATTERN_LEN 18

typedef struct{
    unsigned int start;
    unsigned int finish;
}index;

void remove_str_pattern(char *original, char *extract, unsigned int start, unsigned int finish);
void splitter(char *x, index *index_SF);
unsigned int count_points(const char *x);
void obscure(char *str, index index_SF);

void main(){
    index index_SF = {0,0};
    char *origin = "this is first try for me in stack aa:bb:22:44:55:66 overflow...";
    char *str_export = calloc(PATTERN_LEN, sizeof(char));
    char *tmp = calloc(sizeof(origin)/sizeof(char), sizeof(char));

    strcpy(tmp, origin);

    splitter(origin, &index_SF);

    obscure(tmp, index_SF);

    remove_str_pattern(origin, str_export, index_SF.start, index_SF.finish);

    printf("start index: %u finish index: %u\n", index_SF.start, index_SF.finish);
    printf("obscured string %s\n", tmp);
    printf("original str: %s\n", origin);
    printf("pattern: %s\n", str_export);

}

void obscure(char *str, index index_SF){
   for(unsigned int i = index_SF.start; i < index_SF.finish+1; ++i){
        if(str[i] != ':'){
            str[i] = '*';
        }
    }
}

void splitter(char *x, index *index_SF){
    for(unsigned int i = 0, tmp = 0; i < strlen(x); ++i){
        if(x[i] == ':'){
            ++tmp;
            if(tmp == 1){
                index_SF->start = i-2;
            }else{
                if(tmp == 5){
                    index_SF->finish = i+2;
                }
            }
        }
    }
}

unsigned int count_points(const char *x){
    int count = 1;

    for(unsigned int i = 0; i < strlen(x); ++i){
        if((x[i] == ':' && x[i+2] == ':') || (x[i] == ':' && x[i-2] == ':')){
            ++count;
        }
    }
    return count;
}

void remove_str_pattern(char *original, char *extract, unsigned int start, unsigned int finish){
    for(unsigned int i = start, j = 0; i < finish+1; ++i, ++j){
        extract[j] = original[i];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...