2020-10-15 C语言字符串处理常见函数和处理逻辑

//字符串处理常见函数

//内存清空
void *memset(void *s, int ch, size_t n);
//内存拷贝
void *memcpy(void *destin, void *source, unsigned n);

//读取文件中的一行
char *fgets(char *str, int n, FILE *stream);
//字符串写入文件中,如果是写入一行,需要在str后面加上换行符
int fputs(const char *str, FILE *stream);

//字符串长度,一般使用需要: int len = (int)strlen((const char *)str);
size_t strlen(const char *s);
//查找某字符在字符串中首次出现的位置
char * strchr (const char *str, int c);
//查找某字符在字符串中最后一次出现的位置
char * strrchr(const char *str, int c);
//strstr函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。
char *strstr(const char *haystack, const char *needle);

//格式化组装字符串
int snprintf(char * buf, size_t size, const char * fmt, ...);
//拼接字符串
char* strncat(char *, const char *, size_t);
//比较字符串
int strncmp(const char * cs, const char * ct, size_t count);
//拷贝字符串
char* strncpy(char * dest, const char * src, size_t n);

//字符串循环字符
//从头循环
void str_forward_while(char* str)
{
    int comma_cnt = 0;
    char* tmp = str;
    while(*tmp) { //计算英文逗号个数
        if(*tmp == ',') {
            comma_cnt++;
        }
        tmp++;
    }
    return ;
}
//从尾部循环
void str_back_while(char * str)
{
    int i = 0;
    int str_len = strlen((const char*)str);
    for (i = str_len-1; i >= 0; i--) {  //去掉换行符
        if ((*(str+i) == '\r') || (*(str+i) == '\n')) {
            *(str+i) = '\0';
        } else {
            break;
        }
    }
    return ;
}


//字符大小写转换
void str_to_lwr(char *ps) //转小写
{
    while(*ps) {
        if('A' <= *ps && *ps <= 'Z') {
            *ps += 'a'-'A';
        }
        ps++;
    }
    return ;
}

void str_to_upr(char *ps) //转大写
{
    while(*ps) {
        if('a' <= *ps && *ps <= 'z') {
            *ps -= 'a'-'A';
        }
        ps++;
    }
    return ;
}

//删除字符串中所有的目标字符
void str_delete_char(char str[],char target)
{
    int i = 0,j = 0;
    for(i = j = 0; str[i]!='\0'; i++){
        if(str[i] != target){
            str[j++] = str[i];
        }
    }
    str[j]='\0';
    return ;
}

//复制字符串或者复制部分字符
//不一定需要拷贝函数等,可以采用状态机方式
void str_copy(char* src_str, char* dst_str)
{
    char* start = NULL;
    int pos = 0;
    start = src_str;
    while(*start) {
        switch (*start) {
            case '\"':
                break;
            case ':':
                break;
            case ',':
                break;
            default:
                *(dst_str+pos) = *start;
                pos++;
                break;
        }
        start++;
    }
    *(dst_str+pos) = '\0';

    return ;
}

//字符串分解 strsep
//例如解析csv格式文件
#define COMMA_SEPARATOR_CHAR    ","
int strsep_use (char* str)
{
    int i = 0;
    field = strsep(&str, COMMA_SEPARATOR_CHAR);
    if (i == 0) {
        if (strlen(field) == 0) {
            printf("[%s-%d]field is null\n", __func__, __LINE__);
        } else {
            printf("[%s-%d]field=%s is not null\n", __func__, __LINE__, field);
        }
    }
    
    ++i;
    field = strsep(&str, COMMA_SEPARATOR_CHAR);
    if (i == 1) {
        if (strlen(field) == 0) {
            printf("[%s-%d]field is null\n", __func__, __LINE__);
        } else {
            printf("[%s-%d]field=%s is not null\n", __func__, __LINE__, field);
        }
    }

   return (0);
}

//字符串分解 strtok
//char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。
//输入:str = "ABC-123-xyz";
//输出:
//ABC
//123
//xyz
int strtok_use (char* str)
{
   const char s[2] = "-";
   char *token;
   
   /* 获取第一个子字符串 */
   token = strtok(str, s);
   
   /* 继续获取其他的子字符串 */
   while( token != NULL ) {
      printf( "%s\n", token );
      token = strtok(NULL, s);
   }
   
   return (0);
}

//例子,mac校验
int mac_valid_check(char * pstr)
{
    int i = 0;
    char* strtmp = NULL;

    if (NULL == pstr) {
        printf("check MAC is null\n");
        return -1;
    }

    if (strlen(pstr) != 17) {
        printf("check MAC len[%d] is invalid\n", (int)strlen(pstr));
        return -2;
    }

    strtmp = strtok(pstr, ":");
    while( strtmp != NULL ) {
        printf("strtmp = %s\n", strtmp);
        if (strlen(strtmp) != 2) {
            return -3;
        }

        if ((strtmp[0] >= '0' && strtmp[0] <= '9') ||
            (strtmp[0] >= 'A' && strtmp[0] <= 'F') ||
            (strtmp[0] >= 'a' && strtmp[0] <= 'f')) {
            if ((strtmp[1] >= '0' && strtmp[1] <= '9') ||
                (strtmp[1] >= 'A' && strtmp[1] <= 'F') ||
                (strtmp[1] >= 'a' && strtmp[1] <= 'f')) {
                i++;
                strtmp = strtok(NULL, ":");
            } else {
                return -4;
            }
        } else {
            return -5;
        }
    }

    if (i != 6) {
        return -6;
    }

    return 0;
}

//以{}开始结尾的json串格式简要判断
int json_parse_simple_judge(const char* str)
{
    int len = strlen(str);

    if ((str[0] == '{') && (str[len - 1] == '}'))
    {
        if (len == 2)
        {
            printf("json is {}\n");
            return 0;
        }
    }else {
        printf("[error]json!={xxx}\n");
        return -1;
    }

    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值