分享

Linux C函数之字符串处理函数

 zale的图书馆 2011-06-22

字符串处理函数(13, 19)

这些函数的头文件都是string.h

非str前缀的字符串操作

bcmp: 比较内存中的内容, 建议用memcmp()取代
函数定义: int bcmp(const void *s1, const void *s2, int n);
说明: 用来比较s1和s2所指的内存区前n个字节, 若参数n为0, 则返回0. 若参数s1和s2所指的内存完全相同返回0值, 否则返回非0值.

bcopy: 拷贝内存内容, 建议用memcpy()取代
函数定义: void bcopy(const void *src, void *dest, int n);
说明: bcopy()和memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址, 不过, 参数scr和dest在传给函数时位置是相反的.

bzero: 将一段内存内容全清为0, 建议用bzero()取代
函数定义: void bzero(void *s, int n);
说明: bzero()会将参数s所指的内存区域前n个字节, 全部设为0. 相当于调用memset(void *s, 0, size_t n);

ffs: 在一个整型数(2进制表示)中查找第一个值为1的位
函数定义: int ffs(int i);
说明: ffs()会由低位至高位, 判断参数i的2进制中每一位, 将最先出现位的值为1的位置返回. 若i为0, 返回0.
应用举例:
#include <stdio.h>
#include <string.h>
int main(void)
{
int num[7] = {0, 1, 2, 3, 4, 5, 8};
int i;
for(i = 0; i < 7; i++)
{
   printf("%d: %d\n", num[i], ffs(num[i]));
}
return 0;
}
运行结果:
0: 0   1: 1   2: 2   3: 1   4: 3   5: 1   8: 4

index: 查找字符串中第一个出现的指定字符
函数定义: char *index(const char *s, int c);
说明: index()用来找出参数s字符串中第一个出现的参数c的地址, 然后将该字符出现的地址返回, 结束符也视为字符串的一部分. 返回值, 如果找到指定的字符则返回该字符所在地址, 否则返回0.
rindex: 查找字符串中最后一个出现的指定字符
函数定义: char *rindex(const char *s, int c);
说明: rindex()用来找出参数s字符串中最后一个出现的参数c的地址, 然后将该字符出现的地址返回, 结束符也视为字符串的一部分. 返回值, 如果找到指定的字符则返回该字符所在地址, 否则返回0.
应用举例:
#include <stdio.h>
#include <string.h>
int main(void)
{
const char *s = "1234556554321";
char *p;
printf("%s\n", s);
printf("%s\n", index(s, '5'));
printf("%s\n", rindex(s, '5'));
p = memchr(s, '5', 3);
if(p == NULL)
   printf("NULL\n");
else
   printf("%s\n", p);
printf("%s\n", memchr(s, '5', 8));
return 0;
}
运行结果:
1234556554321
556554321
54321
NULL
556554321

memchr: 在某一内存范围中找一特定字符
函数定义: void *memchr(const void *s, int c, size_t n);
说明: memchr()从头开始搜寻s所指内存的前n个字节, 直到发现第一个值为c的字符, 则返回指向该字符的指针. 如果找不到就返回0.
应用举例: 见index和rinedx

memcmp: 比较内存内容
函数定义: int memcmp(const void *s1, const void *s2, size_t n);
说明: memcmp()用来比较s1和s2所指的内存区间前n个字符. 字符串大小的比较是以ASCII表上的顺序来决定, 此顺序亦为字符的值. memcmp()首先将s1第一个字符值减去s2第一个字符值, 若差值为0则再继续比较下个字符, 若不为0则将等差值返回. 返回值, 若s1和s2相等则返回0, 若s1大于s2则返回大于0的值, 若s1小于s2则返回小于0的值.
应用举例:
#include <stdio.h>
#include <string.h>
int main(void)
{
const char *s1 = "123asd";
const char *s2 = "123edf";
int nR;
nR = memcmp(s1, s2, sizeof(s1));
if(nR == 0)
   printf("0\n");
else if(nR > 1)
   printf("1\n");
else
   printf("-1\n");
return 0;
}
运行结果: 
-1

memset: 将一段内存空间填入某值
函数定义: void *memset(void *s, int c, size_t n);
说明: memset()会将参数s所指向的内存区域前n个字节以参数c填入, 然后返回指向s的指针. 在编写程序时, 若需要将某一数组初始化, 使用memset(). 返回指向s的指针. 注意, 参数c虽然声明为int, 但必须是unsigned char, 所以范围在0到255之间. 
应用举例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[5];
memset(s, 'a', sizeof(s));
s[4] = '\0';
printf("%s\n", s);
return 0;
}
运行结果:
aaaa

memfrob: 对内存区域编码, Linux特有
函数定义: void *memforb(void *s, size_t n);
说明: memfrob()用来将参数s所指的内存空间前n个字符与42作XOR运算, 用途是可以隐藏一特定字符串内容, 只要再用相同的参数调用memfrob()即可将内容还原.
应用举例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[] = "Funtion memfrob tests.";
printf("%s\n", s);
memfrob(s, strlen(s));
printf("%s\n", s);
memfrob(s, strlen(s));
printf("%s\n", s);
return 0;
}
运行结果:
Funtion memfrob tests.
l_D^CED
GOGLXEH
^OY^Y
Funtion memfrob tests.

memcpy: 拷贝内存内容
函数定义: void *memcpy(void *dest, void *scr, size_t n);
说明: memcpy()用来拷贝src所指的内存前n个字节到dest所指的地址上. 于strcpy()不同, memcpy()会完整的复制n个字节, 不会因遇到结束符'\0'而结束. 返回指向dest的指针. 注意, 指针src和dest所指的内存区域不可重叠.
memccpy: 拷贝内存内容
函数定义: void *memccpy(void *dest, const void *src, int c, size_t n);
说明: memccpy()用来拷贝src所指的内存前n个字节到dest所指的地址上. 与memcpy()不同的是, memccpy()会在复制时检查参数c是否出现, 若是出现则返回dest中的值为c的下一个字节地址. 返回0表示在scr中前n个字节中没有c.
memmove: 拷贝内存内容
函数定义: void *memmove(void *dest, const void *src, size_t n);
说明: memmove()和memcpy()一样用来拷贝src所指的内存前n个字节到dest所指的地址上. 不同的是memmove()的scr和dest所指的内存区域可以重叠. 返回值指向dest的指针.
应用举例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char src[] = "abcdefghi\0";
char dest1[10];
char dest2[10];
char dest3[10];
printf("%s\n", src);
memcpy(dest1, src, 10);
memccpy(dest2, src, 'c', 10);//没用明白
memmove(dest3, src, 10);
printf("%s\n", dest1);
printf("%s\n", dest2);
printf("%s\n", dest3);
return 0;
}
运行结果:
abcdefghi
abcdefghi
abcx<???abcdefghi
abcdefghi

str前缀的字符串操作
1. 字符串比较
strcmp: 比较字符串
函数定义: int strcmp(const char *s1, const char *s2);
说明: strcmp()用来比较参数s1和s2字符串. 字符串大小的比较是以ASCII码表上的顺序来决定, 此顺序亦为字符的值. strcmp()首先将s1第一个字符值减去s2第一个字符值,若差值为0则再继续比较下个字符, 若差值不为0则将差值返回. 若参数s1和s2字符串相同则返回0, s1若大于s2则返回大于0的值, s1若小于s2则返回小于0的值.
strncmp: 比较字符串(指定数目)
函数定义: int strncmp(const char *s1, const char *s2, size_t n);
说明: strncmp()用来比较参数s1和s2字符串前n个字符. 若参数s1和s2字符串相同则返回0, s1若大于s2则返回大于0的值, s1若小于s2则返回小于0的值.

strcasecmp: 忽略大小写比较字符串
函数定义: int strcasecmp(const char *s1, const char *s2);
说明: strcasecmp()用来比较参数s1和s2字符串, 比较时会自动忽略大小写的差异. 若参数s1和s2字符串相同则返回0, s1若大于s2则返回大于0的值, s1若小于s2则返回小于0的值.
strncasecmp: 忽略大小写比较字符串(指定数目)
函数定义: int strncasecmp(const char *s1, const char *s2, size_t n);
说明: strncasecmp()用来比较参数s1和s2字符串前n个字符, 比较时会自动忽略大小写的差异. 若参数s1和s2字符串相同则返回0, s1若大于s2则返回大于0的值, s1若小于s2则返回小于0的值.

strcoll: 采用目前区域的字符排列次序来比较字符串
函数定义: int strcoll(const char *s1, const char *s2);
说明: strcoll()会依环境变量LC_COLLATE所指定的文字排列次序来比较s1和s2字符串. 若参数s1和s2字符串相同则返回0, s1若大于s2则返回大于0的值, s1若小于s2则返回小于0的值. 
附加说明: 若LC_COLLATE为“POSIX”或“C”, 则strcoll()与strcmp()作用完全相同.

应用举例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *src = "abcdefefdsa";
char *cmp = "abcdEFe";
printf("%d ", strcmp(src, cmp));
printf("%d ", strncmp(src, cmp, 6));
printf("%d ", strcasecmp(src, cmp));
printf("%d ", strncasecmp(src, cmp, 6));
printf("\n");
return 0;
}
运行结果:
1 32 102 0

2. 字符串连接
strcat: 连接两个字符串
函数定义: char *strcat(char *dest, const char *src);
说明: strcat()会将参数src字符串拷贝到参数dest所指的字符串尾. 注意, 第一个参数dest要有足够的空间来容纳要拷贝的字符串. 返回参数dest的字符串起始地址.
strncat: 连接两个字符串(指定数目)
函数定义: char *strncat(char *dest, const char *src, size_t n);
说明: strncat()会将参数src字符串拷贝n个字符到参数dest所指的字符串尾. 注意, 第一个参数dest要有足够的空间来容纳要拷贝的字符串. 返回参数dest的字符串起始地址.
应用举例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *src = "abcdefghi";
char dest1[30] = "jklmn";
char dest2[30] = "jklmn";
printf("%s\n", src);
printf("%s\n", dest1);
strcat(dest1, src);
printf("%s\n", dest1);
strncat(dest2, src, 6);
printf("%s\n", dest2);
return 0;
}
运行结果:
abcdefghi
jklmn
jklmnabcdefghi
jklmnabcdef

3. 字符串查找
strchr: 查找字符串中第一个出现的指定字符
函数定义: char *strchr(const char *s, int c);
说明: strrchr()用来找出参数s字符串中第一个出现的参数c地址, 然后将该字符出现的地址返回. 如果找不到就返回0.
strrchr: 查找字符串中最后一个出现的指定字符
函数定义: char *strrchr(const char *s, int c);
说明: strrchr()用来找出参数s字符串中最后一个出现的参数c地址, 然后将该字符出现的地址返回. 如果找不到就返回0.

strpbrk: 查找字符串中第一个出现的多个指定字符中的一个字符
函数定义: char *strpbrk(const char *s, const char *accept);
说明: strpbrk()用来找出参数s字符串中最先出现存在参数accept字符串中的任意字符. 如果找不到返回0.

strstr: 在一字符串中查找指定的字符串
函数定义: char *strstr(const char *haystack, const char *needle);
说明: strstr()会从字符串haystack中搜寻字符串needle, 并将第一次出现的地址返回. 如果找到指定的字符则返回该字符所在地址,否则返回0.

strcspn: 返回字符串中从头开始连续不含指定字符串内容的字符数
函数定义: size_t strcspn(const char *s ,const char *reject);
说明: strcspn()从参数s字符串的开头计算连续的字符, 而这些字符都完全不在参数reject所指的字符串中. 简单地说, 若strcspn()返回的数值为n, 则代表字符串s开头连续有n个字符都不含字符串reject内的字符.
strspn: 返回字符串中从头开始连续含指定字符串内容的字符数
函数定义: size_t strspn(const char *s, const char *accept);
说明: strspn()从参数s字符串的开头计算连续的字符, 而这些字符都完全是accept所指字符串中的字符. 简单的说, 若strspn()返回的数值为n, 则代表字符串s开头连续有n个字符都是属于字符串accept内的字符.

应用举例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *src = "15648499166581";
char *pchr, *prchr, *ppbrk, *pstr;
int ncspn, nspn;
pchr = strchr(src, '5');
prchr = strrchr(src, '5');
ppbrk = strpbrk(src, "6489");
pstr = strstr(src, "849");
ncspn = strcspn(src, "489");
nspn = strspn(src, "916");
printf("%s\n", src);
printf("%s\n", pchr);
printf("%s\n", prchr);
printf("%s\n", ppbrk);
printf("%s\n", pstr);
printf("%d\n", ncspn);
printf("%d\n", nspn);
return 0;
}
运行结果:
15648499166581
5648499166581
581
648499166581
8499166581
3
1

4. 字符串拷贝
strcpy: 拷贝字符串
函数定义: char *strcpy(char *dest, const char *scr);
说明: strcpy()会将参数src字符串拷贝至参数dest所指的地址. 返回参数dest的字符串起始地址. 注意, 如果参数dest所指的内存空间不够大, 可能会造成缓冲溢出的错误情况,在编写程序时请特别留意, 或用strncpy()来取代.
strncpy: 拷贝字符串(指定数目)
函数定义: char *strncpy(char *dest, const char *src, size_t n);
说明: strncpy()会将参数src字符串拷贝前n个字符至参数dest所指的地址, 返回参数dest的字符串起始地址
strdup: 拷贝字符串(自动配置内存空间)
函数定义: char *strdup(const char *s);
说明: strdup()会先用maolloc()配置与参数s字符串相同的空间大小, 然后将参数s字符串的内容复制到该内存地址, 然后把该地址返回. 该地址最后可以利用free()来释放. 返回一指向复制后的新字符串地址的指针; 若返回NULL表示内存不足. 
应用举例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char *src = "abcdefghi";
char *destcpy, *destncpy, *destdup;
printf("%s\n", src);
destcpy = (char *)malloc(strlen(src));
strcpy(destcpy, src);
printf("%s\n", destcpy);
destncpy = (char *)malloc(strlen(src));
strncpy(destncpy, src, 6);
printf("%s\n", destncpy);
destdup = strdup(src);
printf("%s\n", destdup);
free(destcpy);
free(destncpy);
free(destdup);
return 0;
}
运行结果:
abcdefghi
abcdefghi
abcdef
abcdefghi

5. 其它操作
strfry: 随机重组字符串内的字符
函数定义: char *strfry(char *string);
说明: strfry()会利用rand()来随机重新分配参数string字符串内的字符, 然后返回指向参数string的指针.

strlen: 返回字符串长度, 不包括结束符'/0'
函数定义: size_t strlen(const char *s);
说明: strlen()用来计算指定的字符串s的长度, 不包括结束字符'\0'.

strtok: 分割字符串
函数定义: char *strtok(char *s, const char *delim);
说明: strtok()用来将字符串分割成一个个片段. 参数s指向欲分割的字符串, 参数delim则为分割字符串, 当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为\0字符. 在第一次调用时, strtok()必需给予参数s字符串, 往后的调用则将参数s设置成NULL. 每次调用成功则返回下一个分割后的字符串指针.

应用举例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[] = "as-vd; efdaf;fe-fdef?";
char *d = "-; f";
char *ps;
printf("%s\t%d\n", s, strlen(s));
printf("%s\n", strfry(s)); 
printf("%s ", strtok(s, d));
while((ps = strtok(NULL, d)))
{
   printf("%s ", ps);
}
printf("\n");
return 0;
}
运行结果:
as-vd; efdaf;fe-fdef?   21
;edfvdas-ad; efeff-f?
ed vdas ad e e ?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多