字符串

指针数组和数组指针:

### int (*p)[10];//数组指针
### int *p[10];//指针数组

查找一个字符

char *strchr(char const*str,int ch)
/在字符串str中查找字符ch第一次出现的位置,找到后函数返回一个指向该位置的指针,不存在返回NULL指针/
strchr(string,’h’);

char *strrchr(char const*str,int ch)

/最后一次出现位置/

查找任何几个字符第一次出现位置

char *strpbrk(char const *str,char const *group)

/一组。。。第一次/
strpbrk(string,”aeiou”);

查找一个子串

char *strstr(char cconst *s1,char const *s2)

/查找s1中s2第一次出现位置,存在返回指向该位置的指针,否则返回NULL指针,若s2为空字符串则返回s1/

自制strrstr函数

char *my_strrstr(const char *dest, const char *src)
{
const char *ret = NULL;
const char *last = NULL;
assert(dest);
assert(src);
if (*src == ‘\0’)
return (char *)dest;
while (ret = strstr(dest, src))
{
last = ret;
dest = ret + 1;
}
return (char *)last;
}

查找一个字符串前缀

用于在字符串的起始位置对字符计数
group字符串指定一个或多个字符。strspn返回str起始部分匹配group中任意字符的字符数。

size_t strspn(char const *str,char const *accept)

【函数说明】strspn() 从参数 str 字符串的开头计算连续的字符,而这些字符都完全是 accept 所指字符串中的字符。简单的说,若 strspn() 返回的数值为n,则代表字符串 str 开头连续有 n 个字符都是属于字符串 accept 内的字符。

【返回值】返回字符串 str 开头连续包含字符串 accept 内的字符数目。所以,如果 str 所包含的字符都属于 accept,那么返回 str 的长度;如果 str 的第一个字符不属于 accept,那么返回 0。

size_t strcspn(char const *str,char const *group)

strcspn() 从字符串 str 的开头计算连续的字符,而这些字符都完全不在字符串 accept 中。简单地说,若 strcspn() 返回的数值为 n,则代表字符串 str 开头连续有 n 个字符都不含字符串 accept 中的字符。

【返回值】返回字符串 str 开头连续不含字符串 accept 内的字符数目。

注意:如果 str 中的字符都没有在 accept 中出现,那么将返回 atr 的长度;检索的字符是区分大小写的。

提示:函数 strspn() 的含义与 strcspn() 相反,可以对比学习。

查找标记

strtok

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

返回值:返回下一个分割后的字符串指针,如果已无从分割则返回NULL。

char s[] = "ab-cd : ef;gh :i-jkl;mnop;qrs-tu: vwx-y;z";
char *delim = "-:;";
char *p;
printf("%s ", strtok(s, delim));
while ((p = strtok(NULL, delim)))
    printf("%s ", p);
printf("\n");

字符操作

ctype.h库,字符分类函数

iscntrl 任何控制字符
isspace 空白字符:空格’ ‘, 换页’\f’, 换行‘\n’, 回车’r’, 制表符’\t’ 垂直制表符’\v’
isdigit 十进制数字
isxdigit 十六进制数字
islower 小写字母
isupper 大写字母
isalpha 字母
isalnum 数字或字母
ispunct 标点符号,任何不属于数字或字母的图形字符
isgraph 任何图形字符
isprint 任何可打印字符

字符转化函数

int tolower(int ch)
int toupper(int ch)

内存操作:遇到\0不会停止操作

void *memcpy(void*dest, const void *src, size_t n);

返回值说明:返回指向dest的void *指针

1.与strcpy相比,memcpy并不是遇到’\0’就结束,而是一定会拷贝完n个字节。memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。

例:
  char a[100], b[50];
  memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。
  memcpy(d,s,strlen(s));:复制全部
  memcpy(d,s+14,4);//从第14个字符(V)开始复制,连续复制4个字符
  

2.只覆盖部分数据,并不是全部覆盖

void *memmove(void *dest, const void *source, size_t count)

返回值说明:返回指向dest的void *指针
参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数
函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。

与memcpy作用一样,但目标区域和源区域可以重叠

void *memcmp(void const *a,void const *b,size_t length)

比较length个字节

void *memchr(void const *a,int ch,size_t length)

找n个字节

void *memset(void *a,int ch,size_t length)

char ch[10]
比如memset(ch,0,8),就是把数组ch前八项置为零,后面的不一定为零。比如刚开始ch[1]=’z’,ch[8]=’a’,ch[9]=’b’,经过memset后,ch[1]为零了,而ch[8],ch[9]都不变.

你可能感兴趣的:(字符串)