C字符串处理库函数

http://blog.csdn.net/pipisorry/article/details/36898405

使用C语言字符串处理的库函数,务必#include <string.h>


1、 比较字符串大小函数  

 1) 忽略大小写---strcasecmp

函数原型: int strcasecmp (const char *s1, const char *s2);

函数说明: 用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异

2)忽略大小写—stricmp

函数原型:int stricmp(char *str1, char *str2);

函数说明:以大小写不敏感方式比较两个串

3) 不忽略大小写—strcmp

函数原型:int strcmp(char*str1,char*str2);

函数说明:通过比较字串中各个字符的ASCII码,来比较参数Str1和Str2字符串,比较时考虑字符的大小写。

当str1<str2时,返回值<0 当str1=str2时,返回值=0

4) 比较一部分—strncmpi

函数原型:int strncmpi(char *str1, char *str2, unsigned maxlen);

函数说明:比较字符串str1和str2的前maxlen个字符

5)内存区域比较---memcmp

函数原型:int memcmp(void*buf1,void *buf2,unsigned int count)

函数说明:比较内存区域buf1和buf2的前count个字节。Void*是指任何类型的指针。

6)内存区域部分比较-- memicmp Void*是指任何类型的指针。

函数原型:int memicmp(void*buf1,void *buf2,unsigned int count)

函数说明:比较内存区域buf1和buf2的前count个字节,但不区分大小写。

以上比较函数的返回值: 若参数1中字符串和参数中2字符串相同则返回0;

            若参数1中字符串长度大于参数2中字符串长度则返回大于0 的值;

            若参数1中字符串 长度小于参数2中字符串 长度则返回小于0的值。

皮皮blog



2、 从字符串中提取子串  

1) 提取子串--strstr

函数原型:char* strstr(char*src,char*find)

函数说明:从字符串src中寻找find第一次出现的位置(不比较结束符NULL)

返回值:返回指向第一次出现find位置的指针,如果没有找到则返回NULL

2) 字符串分割,提取分隔符间字串—strtok

一、用strtok函数进行字符串分割

函数原型:char *strtok(char*src, char*delim);

函数说明:分解字符串诶一组标记串,src为要分解的字符串,delim为分隔符字符串。

            首次调用时,src必须指向要分解的字符串,随后调用要把s设成NULL;

              strtok中src中查找包含在delim中的字符,并用NULL(’\0’)来替换直到找遍整个字符串。

返回值:从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。

             所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。

举例:

   

 #include<string.h>
    #include<stdio.h>
    int main(){
        char*s="Golden Global View";
        char*d=" ";
        char *p;
        p=strtok(s,d);
        while(p){
         printf("%s\n",p);
         strtok(NULL,d);
        }
        return 0;
}

输出:Golden

           Global

           View

二、用STL进行字符串的分割 

涉及到string类的两个函数find和substr:
1、find函数
原型:size_t find ( const string& str, size_t pos = 0 ) const;
功能:查找子字符串第一次出现的位置。
参数说明:str为子字符串,pos为初始查找位置。
返回值:找到的话返回第一次出现的位置,否则返回string::npos 

2、substr函数
原型:string substr ( size_t pos = 0, size_t n = npos ) const;
功能:获得子字符串。
参数说明:pos为起始位置(默认为0),n为结束位置(默认为npos)
返回值:子字符串 

实现如下:

复制代码
 1 //字符串分割函数
2 std::vector<std::string> split(std::string str,std::string pattern)
3 {
4 std::string::size_type pos;
5 std::vector<std::string> result;
6 str+=pattern;//扩展字符串以方便操作
7 int size=str.size();
8
9 for(int i=0; i<size; i++)
10 {
11 pos=str.find(pattern,i);
12 if(pos<size)
13 {
14 std::string s=str.substr(i,pos-i);
15 result.push_back(s);
16 i=pos+pattern.size()-1;
17 }
18 }
19 return result;
20 }

三、用Boost进行字符串的分割

用boost库的正则表达式实现字符串分割
实现如下:

复制代码
 1 std::vector<std::string> split(std::string str,std::string s)
2 {
3 boost::regex reg(s.c_str());
4 std::vector<std::string> vec;
5 boost::sregex_token_iterator it(str.begin(),str.end(),reg,-1);
6 boost::sregex_token_iterator end;
7 while(it!=end)
8 {
9 vec.push_back(*it++);
10 }
11 return vec;
12 }

boost里面有自带的split的函数,如果用boost的话,还是直接用split的好,这里就不多说了,代码如下:

复制代码
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
 
using namespace std;
 
int main()
{
  string s = "sss/ddd,ggg";
  vector<string> vStr;
  boost::split( vStr, s, boost::is_any_of( ",/" ), boost::token_compress_on );
  for( vector<string>::iterator it = vStr.begin(); it != vStr.end(); ++ it )
    cout << *it << endl;
  return 0;
}

[字符串分割(C++)]

此外还有:strtok函数、strtok_s函数、strstr函数

[C/C++ 分割字符串的多种方式]

皮皮blog


3、 字符串复制

1) 字串复制--strcpy

函数原型:char*strcpy(char*dest,char*src)

函数说明:把src所指由NULL结束的字符串复制到dest所指的数组中。

                  其中,src和dest所致内存区域不可重叠且dest必须有足够的空间来容纳src的字符串。

返回值:返回指向dest的指针。

strcpy 是依据 /0 作为结束判断的,如果 to 的空间不够,则会引起 buffer overflow。strcpy 常规的实现代码如下(来自 OpenBSD 3.9):

char * strcpy(char *to, const char *from){

       char *save = to; 

       for (; (*to = *from) != '/0'; ++from, ++to);

       return(save);

}

但通常,我们的 from 都来源于用户的输入,很可能是非常大的一个字符串,因此 strcpy 不够安全。


利用strncpy替代strcpy来防止缓冲区越界,但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。

2. strncpy

原型:extern  char *strncpy(char   *dest,   char   *src,   int   n);    

功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。

说明:

如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。  

如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。  

返回指向dest的指针。  


在 ANSI C 中,strcpy 的安全版本是 strncpy,但 strncpy 其行为是很诡异的(不符合我们的通常习惯)。

标准规定 n 并不是 sizeof(s1),而是要复制的char 的个数。一个最常见的问题,就是 strncpy 并不帮你保证 /0结束。

char buf[8];

strncpy( buf, "abcdefgh", 8 );

看这个程序,buf 将会被 "abcdefgh" 填满,但却没有 /0 结束符了。

另外,如果 s2 的内容比较少,而 n 又比较大的话,strncpy 将会把之间的空间都用 /0 填充。这又出现了一个效率上的问题,如下:

char buf[80];

strncpy( buf, "abcdefgh", 79 );

上面的 strncpy 会填写 79 个 char,而不仅仅是 "abcdefgh" 本身。

strncpy 的标准用法为:(手工写上 /0)

strncpy(path, src, sizeof(path) - 1);

path[sizeof(path) - 1] = '/0';

len = strlen(path);

3. strlcpy

// Copy src to string dst of size siz. At most siz-1 characters will be copied. Always NUL terminates (unless siz == 0).

// Returns strlen(src); if retval >= siz, truncation occurred.

size_t   strlcpy(char *dst, const char *src, size_t siz);

而使用 strlcpy,就不需要我们去手动负责 /0 了,仅需要把 sizeof(dst) 告之 strlcpy 即可:

strlcpy(path, src, sizeof(path));

len = strlen(path);

if ( len >= sizeof(path) )

       printf("src is truncated.");

并且 strlcpy 传回的是 strlen(str),因此我们也很方便的可以判断数据是否被截断。

[* 一点点历史 *]

strlcpy 并不属于 ANSI C,至今也还不是标准。

strlcpy 来源于 OpenBSD 2.4,之后很多 unix-like 系统的 libc 中都加入了 strlcpy 函数,我个人在FreeBSD、Linux 里面都找到了 strlcpy。(Linux使用的是 glibc,

glibc里面有 strlcpy,则所有的 Linux 版本也都应该有 strlcpy)

但 Windows 下是没有 strlcpy 的,对应的是strncpy和memset函数

memset函数

void *memset(void *s,int c,size_t n)
作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。

[memset函数详细说明]

2) 字串复制--strdup

函数原型:char* strdup(char*src)

函数说明:复制字符串src

返回值:返回指向被复制字符串的指针,所需空间有malloc()分配且可以有free()释放。

3) 内存空间复制--memcpy

函数原型:void *memcpy(void *dest,void *src,unsigned int count);

函数说明:src和dest 所指内存区域不能重叠;由src所致内存区域复制count个字节到dest所指内存区域中。

返回值:返回指向dest的指针。

[http://blog.csdn.net/tigerjibo/article/details/6412759]

皮皮blog



4、字符串连接

1)接尾连接--strcat

函数原型:char* strcat(char*dest,char*src)

函数说明:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'

2)部分连接--strncat

函数原型:char* strncat(char*dest,char*src,int n);

函数说明:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的’\0’)并添加’’\0’.

返回值:返回指向dest的指针。

皮皮blog



5、从字符串中查找字符

1)内存区域找字符--memchr

函数原型:void *memchr(void*buf,char ch,usigned count)

函数说明:从buf所指内存区域的前count个字节查找字符ch,当第一次遇到字符ch时停止查找。

返回值:如果找到了,返回指向字符ch的指针;否则返回NULL

2)字串中找字符--strchr

函数原型:char*strchr(char*src,char ch)

函数说明:查找字符串s中首次出现字符ch的位置

返回值:返回首次出现c的位置的指针,如果s中不存在c则返回NULL

3)搜所现字符--strcspn

函数原型:int strcspn(char*src,char*find)

函数说明:在字符串src中搜寻find中所出现的字符

返回值:返回第一个出现的字符在src中的下标值,即src中出现而不在find中出现的字串的长度。

举例:

#include<string.h>
#include<stdio.h>
int main(){
    char*s="Golden Global View";
    char*r="new";
    int n;
   n=strcspn(s,r);
   printf("The first char both in s1 and s2 is: %c",s[n]);
   return 0;
}


输出:The first char both in s1 and s2 is :e

4)匹配任一字符--strpbrk

函数原型:char*strpbrk(char*s1,char*s2)

函数说明:在字符串S1中寻找字符串S2中任何一个字符相匹配的第一个字符的位置,空字符不包括在内。

返回值:返回指向S1中第一个相匹配的字符的指针,如果没有匹配字符则返回空指针。

举例:

#include<stdio.h>
#include<string.h>
int main(){
    char *s1="WelcomeTo Beijing";
    char*s2="BIT";
    char *p;
   p=strpbrk(s1,s2);
    if(p)
       printf("%s\n",p);
    elseprintf("Not Found!\n");
    return 0;
}

输出:To Beijing

皮皮blog


6、其他函数

1)全部转成大写---strupr

函数原型:char*strupr(char*src)

函数说明:将字符串src转换成大写形式,只转换src中出现的小写字母,不改变其他字符

返回值:返回指向src的指针。

2)全部转成小写---strlwr

函数原型:char*strlwr(char*src)

函数说明:将字符串src转换成小写形式,只转换src中出现的大写字母,不改变其他字符

返回值:返回指向src的指针。

3)将字串逆向--strrev

函数原型:char*strrev(char*src)

函数说明:把字符串src的所有字符的顺序颠倒过来(不包括NULL, 原地颠倒),会改变原来的str,返回的也是改变之后的str

不是标准string库里包含的,是微软自己发明的,类似还有atoi之类(在标准的g++中编译可能不会通过)

只能自己实现:

char * strrev(char *str){					//字符串反转,不包括'\0'
	char * head = str,* tail = str;
	while(*tail++);
	tail -= 2;//tail指向最后一个非'\0'字符

	char tmp;
	while(head < tail){
		tmp= *head;
		*head++ = *tail;
		*tail-- = tmp;
	}
	return str;
}

返回值:返回指向颠倒顺序后的字符串指针

4)计算字符串长度--strlen

原型:extern int strlen(char *s);

用法:#include <string.h>

功能:计算字符串s的(unsigned int型)长度

说明:返回s的长度,不包括结束符NULL。

from:http://blog.csdn.net/pipisorry/article/details/36898405

ref:http://blog.csdn.net/21aspnet/article/details/1539970


  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 1 正文 4 一、 C++的string的使用 4 1.1 C++ string简介 4 1.2 string的成员 4 1.2.1 append 4 1.2.2 assign 5 1.2.3 at 5 1.2.4 begin 6 1.2.5 c_str 6 1.2.6 capacity 6 1.2.7 clear 7 1.2.8 compare 7 1.2.9 copy 7 1.2.10 _Copy_s 7 1.2.11 data 7 1.2.12 empty 7 1.2.13 end 7 1.2.14 erase 7 1.2.15 find 7 1.2.16 find_first_not_of 8 1.2.17 find_first_of 8 1.2.18 find_last_not_of 9 1.2.19 find_last_of 9 1.2.20 get_allocator 9 1.2.21 insert 9 1.2.22 length 9 1.2.23 max_size 9 1.2.24 push_back 9 1.2.25 rbegin 9 1.2.26 rend 9 1.2.27 replace 9 1.2.28 reserve 11 1.2.29 resize 12 1.2.30 rfind 12 1.2.31 size 12 1.2.32 substr 12 1.2.33 swap 12 1.3 string的构造 12 1.4 string的重载运算符 12 1.5 string与algorithm相结合的使用 13 1.5.1 string与remove 13 1.5.2 string与unique、sort 13 1.5.3 string与search 13 1.5.4 string和find、find_if 14 1.5.5 string与copy、copy_if 14 1.5.6 string与count、count_if 15 1.6 string与wstring 15 1.6.1 简介 15 1.6.2 wstring实例 15 1.6.3 wstring与控制台 16 1.6.4 string与wstring的相互转换 17 1.7 string与C++流 22 1.7.1 C++流简介 22 1.7.2 string与iostream、fstream 22 1.8 格式化字符串 23 1.8.1 简单常用的C方法 23 1.8.2 boost的方法 23 1.8.3 stlsoft + fastformat 23 1.9 string与CString 24 二、 boost字符串算法 24 2.1 boost字符串算法导论 24 2.1.1 boost.algorithm.string是什么? 24 2.1.2 相关 24 2.1.3 boost.range导论 24 2.1.4 boost.regex导论 24 2.1.5 boost.algorithm.string的DNA 24 2.2 boost字符串算法解密 24 2.2.1 修剪(trim.hpp) 24 2.2.2 转换(case_conv.hpp) 24 2.2.3 判断式、断言函数(predicate.hpp)【Predicates】 24 2.2.4 查找 24 2.2.5 删除和替换 24 2.2.6 分割和组合 24 2.2.7 分词 24 2.2.8 其它 24 三、 C字符串 24 3.1 C字符串常用算法 24 3.1.1 strcpy wcscpy 24 3.1.2 strcat wcscat 24 3.1.3 strchr wcschr 24 3.1.4 strcmp wcscmp 24 3.1.5 stricmp wcsicmp 24 3.1.6 strlen wcslen 24 3.1.7 strlwr/_strlwr wcslwr/_wcslwr 24 3.1.8 strncat wcsncat 24 3.1.9 strcspn wcscspn 24 3.1.10 strdup/_strdup wcsdup/_wcsdup 24 3.1.11 strncpy wcsncpy 24 3.1.12 strpbrk wcspbrk 24 3.1.13 strrev/_strrev wcsrev/_wcsrev 24 3.1.14 strset/_strset/_strset_l wcsset/_wcsset/_wcsset_l 24 3.1.15 strstr/wcsstr 24 3.1.16 strtok/wcstok 24 3.1.17 strupr/_strupr wcsupr/_wcsup
目录 1 正文 3 一、 C++的string的使用 3 1.1 C++ string简介 3 1.2 string的成员 3 1.2.1 append 3 1.2.2 assign 4 1.2.3 at 4 1.2.4 begin 5 1.2.5 c_str 5 1.2.6 capacity 5 1.2.7 clear 6 1.2.8 compare 6 1.2.9 copy 6 1.2.10 _Copy_s 6 1.2.11 data 6 1.2.12 empty 6 1.2.13 end 6 1.2.14 erase 6 1.2.15 find 6 1.2.16 find_first_not_of 7 1.2.17 find_first_of 8 1.2.18 find_last_not_of 8 1.2.19 find_last_of 8 1.2.20 get_allocator 8 1.2.21 insert 8 1.2.22 length 8 1.2.23 max_size 8 1.2.24 push_back 8 1.2.25 rbegin 8 1.2.26 rend 8 1.2.27 replace 8 1.2.28 reserve 10 1.2.29 resize 11 1.2.30 rfind 11 1.2.31 size 11 1.2.32 substr 11 1.2.33 swap 11 1.3 string的构造 11 1.4 string的重载运算符 12 1.5 string与algorithm相结合的使用 12 1.5.1 string与remove 12 1.5.2 string与unique、sort 12 1.5.3 string与search 12 1.5.4 string和find、find_if 13 1.5.5 string与copy、copy_if 13 1.5.6 string与count、count_if 14 1.6 string与wstring 14 1.6.1 简介 14 1.6.2 wstring实例 15 1.6.3 wstring与控制台 15 1.6.4 string与wstring的相互转换 16 1.7 string与C++流 21 1.7.1 C++流简介 21 1.7.2 string与iostream、fstream 21 1.8 格式化字符串 22 1.8.1 简单常用的C方法 22 1.8.2 boost的方法 22 1.9 string与CString 23 二、 boost字符串算法 23 2.1 boost字符串算法导论 23 2.1.1 boost.algorithm.string是什么? 23 2.1.2 相关 23 2.1.3 boost.range导论 23 2.1.4 boost.regex导论 23 2.1.5 boost.algorithm.string的DNA 24 2.2 boost字符串算法解密 24 2.2.1 修剪(trim.hpp) 24 2.2.2 转换(case_conv.hpp) 26 2.2.3 判断式、断言函数(predicate.hpp)【Predicates】 27 2.2.4 查找 28 2.2.5 删除和替换 29 2.2.6 分割和组合 31 2.2.7 其它 32 三、 C字符串 32 3.1 C字符串常用算法 32 3.1.1 strcpy wcscpy 32 3.1.2 strcat wcscat 32 3.1.3 strchr wcschr 32 3.1.4 strcmp wcscmp 33 3.1.5 stricmp wcsicmp 33 3.1.6 strlen wcslen 33 3.1.7 strlwr/_strlwr wcslwr/_wcslwr 33 3.1.8 strncat wcsncat 33 3.1.9 strcspn wcscspn 33 3.1.10 strdup/_strdup wcsdup/_wcsdup 34 3.1.11 strncpy wcsncpy 34 3.1.12 strpbrk wcspbrk 35 3.1.13 strrev/_strrev wcsrev/_wcsrev 35 3.1.14 strset/_strset/_strset_l wcsset/_wcsset/_wcsset_l 35 3.1.15 strstr/wcsstr 35 3.1.16 strtok/wcstok 36 3.1.17 strupr/_strupr wcsupr/_wcsupr 36 3.2 更安全的C字符串函数 36 3.2.1 简述 36 3.2.2 简单实例 36 3.2.3 定制 38 3.2.4 兼容 41 3.3 通用字函数 47 3.3.1 简述 47 3.3.2 简单实例 47 3.3.3 映射表 48 3.4 API级的字符串处理 48 3.4.1 简述 48 3.4.2 旧的API 48 3.4.3 Shell字符串函数 48 3.4.4 新的安全版字符串处理API 48 四、 C++字符串使用的建议 51 附录1:参考资料: 51 附录2: MSSTLbasic_string的部分源码解读 51 2.1 string的allocator 51 2.1.1 Allocate和Deallocate 51 2.1.2 allocator的泛型实现 52 2.1.3 string与char_traits 54 2.1.4 以char和wchar_t特化char_traits 56 附录3:Boost.Format文文档 57 2.1 大纲 57 2.2 它是如何工作的 57 2.3语法 58 2.3.1 boost::format( format-string ) % arg1 % arg2 % ... % argN 58 2.3.2 printf 格式化规则 59 2.3.3 新的格式规则 60 附录4 TCHAR.h 映射表 60
高效的 C++ JSON 解析/生成器,提供 SAX 及 DOM 风格 API 简介 RapidJSON 是一个 C++ 的 JSON 解析器及生成器。它的灵感来自RapidXml 。 RapidJSON 小而全。它同时支持 SAX 和 DOM 风格的 API。SAX 解析器只有约 500 行代码。 RapidJSON 快。它的性能可与 strlen() 相比。可支持 SSE2/SSE4.2 加速。 RapidJSON 独立。它不依赖于 BOOST 等外部。它甚至不依赖于 STL。 RapidJSON 对内存友好。在大部分 32/64 位机器上,每个 JSON 值只占 16 字节(除字符串外)。它预设使用一个快速的内存分配器,令分析器可以紧凑地分配内存。 RapidJSON 对 Unicode 友好。它支持 UTF-8、UTF-16、UTF-32 (大端序/小端序),并内部支持这些编码的检测、校验及转码。例如,RapidJSON 可以在分析一个 UTF-8 文件至 DOM 时,把当的 JSON 字符串转码至 UTF-16。它也支持代理对(surrogate pair)及 "\u0000"(空字符)。 JSON(JavaScript Object Notation)是一个轻量的xx交换格式。RapidJSON 应该完全遵从 RFC7159/ECMA-404,并支持可选的放宽语法。 一、使用说明         rapidjson.fne 为英文原版         rapidjson_cn.fne  为文翻译版(翻译的文命令有点糙),使用文版时,请改文件名为rapidjson.fne 不然会出错的。         rapidjson_static.lib 为静态,部分文英文。         文和英文可以无缝切换,直接替换支持文件就可以了。         本支持由VS2017,所以编译时,也必须要用VS2017编译。         VC2017连接器下载地址: http://bbs.eyuyan.com/read.php?tid=410252   VS2017易支持模板+VC2017链接器(讨厌vc6的可看)-->hxznhf http://bbs.eyuyan.com/read.php?tid=408541   全易论坛独创首发,Vs2017Linker编译器 -->cs666         关于RapidJSON的相关问题,请看:http://rapidjson.org/zh-cn/md_doc_faq_8zh-cn.html         使用有声明问题请加QQ群: 心宇->EVAxx研究心(255829517)         现在支持完善了大概80%左右,已经可以正常使用,剩下20%是关于 reader 和编码以及一些参数有关,暂时对易不是很重要,后面也会完善。 二、版权声明         本支持为封装TX开源项目 RapidJSON ,为解决易语言 没有高性能JSON的问题。         项目官网:http://rapidjson.org/zh-cn/         github:https://github.com/Tencent/rapidjson/

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值