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 的格式非常有区别,我能想到的唯一更简单的方法是进行字符串匹配以找到子字符串,然后将其替换为*
. 不过,我对其他更具创新性的方式持开放态度。
#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); 对于从字符串返回模式值..
好运的人!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句