yiffer的个人空间 https://blog.eetop.cn/edesign [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

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

已有 1760 次阅读| 2009-11-21 09:45 |个人分类:Linux程序开发

查看文章
 
Linux C函数之字符串处理函数
2008-11-15 02:10

字符串处理函数(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 efdaffe-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
}


本文来源:http://www.edesign-stuido.com.cn


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 3

    粉丝
  • 0

    好友
  • 20

    获赞
  • 69

    评论
  • 3705

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-18 20:31 , Processed in 0.021496 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部