//字符串处理常见函数
//内存清空
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;
}