文档章节

常用LINUX_C字符串处理函数整理

溪边九节
 溪边九节
发布于 2014/04/09 23:15
字数 743
阅读 42
收藏 0
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*删除在src中的str串*/
char *strdel(char *src, char *str)
{
    if(NULL == src || NULL == str)
    {
        return NULL;
    }

    char *pd = strstr(src, str);
    if(NULL == pd)
    {
        return NULL;
    }

    int offset = pd - src;
    strcpy(&src[offset], &src[offset + strlen(str)]);
    return src;
}

/*在指定位置插入串*/
char *strins(char *src, int pos, char *ins)
{
    if(NULL == src || NULL == ins)
    {
        return NULL;
    }

    int src_len = strlen(src);
    if(pos > src_len)
    {
        return NULL;
    }

    int ins_len = strlen(ins);
    char * st = (char *)malloc(sizeof(char)*(src_len - ins_len));

    strcpy(st, &src[pos]);

    strcpy(&src[pos + ins_len], st);

    free(st);
    st = NULL;

    strnset(&src[pos], ' ', ins_len);
    memcpy(&src[pos], ins, ins_len);

    return src;
}

/*替换,将src中的dest串替换成rep*/
char *strrep(char *src, char *dest, char *rep)
{
    if(NULL == src || NULL == dest || NULL == rep)
    {
        return NULL;
    }

    char *pd = strstr(src, dest);
    if(NULL == pd)
    {
        return NULL;
    }

    int offset = pd - src;

    if(NULL == strdel(src, dest))
    {
        return NULL;
    }

    if(NULL == strins(src, offset, rep))
    {
        return NULL;
    }

    return src;
}

/*替换所有src中出现的dest为rep*/
char *strallrep(char *src, char *dest, char *rep)
{
    if(NULL == src || NULL == dest || NULL == rep)
        return NULL;

    while(strrep(src, dest, rep) != NULL)
    {

    }
    return src;
}

/*去除字符串前后空格*/
char *strtrim(char *str)
{
    if(NULL == str)
        return NULL;

    int i = 0;
    while(str[i] == ' ')
    {
        i++;
    }

    strcpy(&str[0], &str[i]);

    i = strlen(str) - 1;

    while(str[i] == ' ')
    {
        //printf("%c ", str[i]);
        i--;
    }

    str[i+1] = '\0';

    return str;

}

/*取得字符串哈希值*/
unsigned int strhash(char *str)
{
	unsigned int seed = 131;
	unsigned int hashval = 0;
	char *tempstr = str;

	while(*tempstr){
		hashval = hashval * seed + (*tempstr++);
	}

	return (hashval & 0x7FFFFFFF);
}

/*获取src串中的label值*/
char *strhtmllabel(char *src, char *label)
{
    if(NULL == src || NULL == label)
        return NULL;

    char *tmp = (char *)malloc(sizeof(char) * strlen(label)+10);
    strcpy(tmp, label);
    strins(tmp, 0, "<");
    strins(tmp, strlen(tmp) , ">");
    //printf("tmp = %s\n", tmp);
    char *beg_p = strstr(src, tmp);
    if(NULL == beg_p)
    {
        free(tmp);
        tmp = NULL;
        return NULL;
    }

    strins(tmp, 1, "/");
    char *end_p = strstr(src, tmp);
    if(NULL == end_p)
    {
        free(tmp);
        tmp = NULL;
        return NULL;
    }

    beg_p = &beg_p[strlen(tmp)-1];
    *end_p = '\0';

    free(tmp);
    tmp = NULL;
    return beg_p;
}

/*直接将文件读入*/
char *strgetfiletext(const char* path)
{
	char *filename = path;
	FILE *f = fopen(filename, "rb");
	fseek(f, 0, SEEK_END);
	long len = ftell(f);
	fseek(f, 0, SEEK_SET);
	char *data = (char *) malloc(len + 1);
	fread(data, 1, len, f);
	fclose(f);
	f = NULL;
	return data;
}

int main()
{

    char *str1 = "hello world!";
    char str2[300] = {0};

    //strcpy 拷贝
    strcpy(str2, str1);//strncpy(str2, str1, strlen(str1));
    printf("%s\n", str2);

    //strrev 转置
    strrev(str2);
    printf("%s\n", str2);
    strrev(str2);

    //strstr 取得指定字串的指针
    char *p = strstr(str2, "world");
    printf("%s\n",p);

    //sscanf char* 转 int等一切
    char *str_num = "123";
    int num = 0;
    sscanf(str_num, "%d", &num);
    printf("num = %d\n", num);


    //sprintf int等一切 转 char*
    int val = 456;
    char str_val[30] = {30};
    sprintf(str_val, "%d", val);
    printf("str_val = %s\n", str_val);

    //strtok 查找以X串分割开的串 注意:strtok会修改str2
    printf("strtok = %s\n", strtok(str2, " "));
    char *cp = NULL;
    while((cp = strtok(NULL, " ")) != NULL)
        printf("strtok = %s\n", cp);

    strset(str2, 0x00);
    strcpy(str2, str1);

    //strupr 转大写字母
    strupr(str2);
    printf("strupr : %s\n", str2);

    //stricmp 忽略大小写比较
    printf("stricmp = %d\n", stricmp(str1, str2));

    //strlwr 转小写字母
    strlwr(str2);
    printf("strlwr : %s\n", str2);


    //strset/strnset 将串整体赋值
    strset(str2, 0x00);//strnset(str2, 0x00, 300);
    printf("%s\n", str2);

    //替换
    strcpy(str2, str1);
    strallrep(str2, "l", " ");
    printf("%s\n", str2);

    //去除前后空格
    strcpy(str2, "  hello!  ");
    strtrim(str2);
    printf("strtrim:%s,%d\n", str2, strlen(str2));

    //字符串哈希
    strcpy(str2, "hello!");
    printf("hashval = %d\n", strhash(str2));
    strcpy(str2, "hello world!");
    printf("hashval = %d\n", strhash(str2));
    strcpy(str2, "hello!");
    printf("hashval = %d\n", strhash(str2));


    //取html标签
    strcpy(str2, "<html><div>hello!</div></html>");
    printf("strhtmllabel:%s\n",strhtmllabel(str2, "div"));

    return 0;

}


© 著作权归作者所有

溪边九节

溪边九节

粉丝 43
博文 129
码字总数 107230
作品 1
南京
程序员
私信 提问
Linux下c基于openssl生成MD5的函数

Linux下openssl提供了一系列哈希及加密的函数,如果调用openssl提供的MD5函数生成任意字符串的MD5呢?下面提供了一段代码实现Linux下c字符串生成md5的函数。 具体代码: 本文由www.169it.com...

小星星程序员
2015/01/08
4.3K
1
Linux中常用C/C++一些头文件的作用

1、 Linux中一些头文件的作用: <assert.h>:ANSI C。提供断言,assert(表达式) <glib.h>:GCC。GTK,GNOME的基础库,提供很多有用的函数,如有数据结构操作函数。使用glib只需要包含<glib.h...

SibylY
2013/09/25
218
0
R for data science 之 stringr包

作者简介Introduction 邬书豪,车联网数据挖掘工程师 ,R语言中文社区专栏作者。微信ID:wsh137552775 知乎专栏:https://www.zhihu.com/people/wu-shu-hao-67/activities 往期回顾 stringr包...

R语言中文社区
2018/02/03
0
0
GNU C和ANSI C函数库的区别

glibc和libc都是Linux下的C函数库, libc是Linux下的ANSI C的函数库; glibc是Linux下的GUN C的函数库; ANSI C和GNU C有什么区别呢? ANSI C是基本的C语言函数库,包含了C语言最基本的库函数...

新年
2014/12/19
245
0
awk、grep、sed是linux操作文本的三大利器,也是必须掌握的linux命令之一

、、是操作文本的三大利器,也是必须掌握的命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属功能最强大,但也最复杂。更适合单纯的查找或匹配文本,更适合编辑匹配到的文本,更适...

[流苏]
2018/07/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

首先呢?我是一名程序员,经常性和同事没话题。 因为每天都会有自己的任务要做,程序员对于其他行业来说;是相对来说比较忙的。你会经常看到程序员在发呆、调试密密麻麻代码、红色报错发呆;...

小英子wep
今天
15
0
【SpringBoot】产生背景及简介

一、SpringBoot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要...

zw965
今天
5
0
简述并发编程分为三个核心问题:分工、同步、互斥。

总的来说,并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共...

dust8080
今天
6
0
OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3.3K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部