字符串基本操作集锦

  所有C语言标准库支持的字符串操作都在string.h中,这个文件在/usr/include/下。确切的说,这个文件还包含对数组的访问。所包含的函数分为以下几类:复制、连接、比较、查找等。
  [b]void[/b] * [b]memcpy[/b] ( [b]void[/b] * [b]destination[/b], [b]const[/b][b]void[/b] * [b]source[/b], [b]size_t[/b][b]num[/b] );
  [b]void[/b] * [b]memmove[/b] ( [b]void[/b] * [b]destination[/b], [b]const[/b][b]void[/b] * [b]source[/b], [b]size_t[/b][b]num[/b] );
  [b]char[/b] * [b]strcpy[/b] ( [b]char[/b] * [b]destination[/b], [b]const[/b][b]char[/b] * [b]source[/b] );
  [b]char[/b] * [b]strncpy[/b] ( [b]char[/b] * [b]destination[/b], [b]const[/b][b]char[/b] * [b]source[/b], [b]size_t[/b][b]num[/b] );
  memcpy:从source处拷贝num字节的数据到destination。
  memmove: 和memcpy一样。但当source和destination出现内存区域重叠时,也能正确处理。
  strcpy: 从source处将字符串拷贝到destination处,拷贝过程一直持续到source中null字符为止。
  strncpy: 从source处拷贝num个字符到destination处。若在拷贝过程中source中有null字符,destination使用0补齐到num个字符处。
  [b]char[/b] * [b]strcat[/b] ( [b]char[/b] * [b]destination[/b], [b]const[/b][b]char[/b] * [b]source[/b] );
  [b]char[/b] * [b]strncat[/b] ( [b]char[/b] * [b]destination[/b], [b]char[/b] * [b]source[/b], [b]size_t[/b][b]num[/b] );
  strcat: 把source传复制并连接到destination后,destination串结尾处的null字符将被source的第一个字符覆盖。source串的某尾处将被添加新的null字符。返回destiination串的指针。
  strncat: 把source的前num个字符复制禀连接到destination后,关于null的操作和strcat相同。
  [b]int[/b][b]memcmp[/b] ( [b]const[/b][b]void[/b] * [b]ptr1[/b], [b]const[/b][b]void[/b] * [b]ptr2[/b], [b]size_t[/b][b]num[/b] );
  [b]int[/b][b]strcmp[/b] ( [b]const[/b][b]char[/b] * [b]str1[/b], [b]const[/b][b]char[/b] * [b]str2[/b] );
  [b]int[/b][b]strcoll[/b] ( [b]const[/b][b]char[/b] * [b]str1[/b], [b]const[/b][b]char[/b] * [b]str2[/b] );
  [b]int[/b][b]strncmp[/b] ( [b]const[/b][b]char[/b] * [b]str1[/b], [b]const[/b][b]char[/b] * [b]str2[/b], [b]size_t[/b][b]num[/b] );
  [b]size_t[/b][b]strxfrm[/b] ( [b]char[/b] * [b]destination[/b], [b]const[/b][b]char[/b] * [b]source[/b], [b]size_t[/b][b]num[/b] );
  memcmp:比较ptr1和ptr2的前num个字节。若二者相等,返回0;否则返回ptr1和ptr2中第一个不相等字节的比较结果。
  strcmp:比较字符串ptr1和ptr2。若二者长度和字符都相等,返回0;否则返回ptr1和ptr2中第一个不相等字符的比较结果。
  strcoll: 根据LCCOLLATE指定的文字排序规则次序比较str1和str2,在LCCOLLATE为"POSIX"或"C"时,strcoll和strcmp作用完全相同
  strncmp:比较ptr1和ptr2的前num个字符。若二者相等,返回0;否则返回ptr1和ptr2中第一个不相等字符的比较结果。
  strxfrm:字符串转换。从source中转换num个字符到destination中,使得strxfrm()转换后,strcmp的结果和直接使用strcoll的结果相同。
  [b]const[/b][b]void[/b] * [b]memchr[/b] ( [b]const[/b][b]void[/b] * [b]ptr[/b], [b]int[/b][b]value[/b], [b]size_t[/b][b]num[/b] );
  [b]const[/b][b]char[/b] * [b]strchr[/b] ( [b]const[/b][b]char[/b] * [b]str[/b], [b]int[/b][b]character[/b] );
  [b]size_t[/b][b]strcspn[/b] ( [b]const[/b][b]char[/b] * [b]str1[/b], [b]const[/b][b]char[/b] * [b]str2[/b] );
  [b]const[/b][b]char[/b] * [b]strpbrk[/b] ( [b]const[/b][b]char[/b] * [b]str1[/b], [b]const[/b][b]char[/b] * [b]str2[/b] );
  [b]const[/b][b]char[/b] * [b]strrchr[/b] ( [b]const[/b][b]char[/b] * [b]str[/b], [b]int[/b][b]character[/b] );
  [b]size_t[/b][b]strspn[/b] ( [b]const[/b][b]char[/b] * [b]str1[/b], [b]const[/b][b]char[/b] * [b]str2[/b] );
  [b]const[/b][b]char[/b] * [b]strstr[/b] ( [b]const[/b][b]char[/b] * [b]str1[/b], [b]const[/b][b]char[/b] * [b]str2[/b] );
  [b]char[/b] * [b]strtok[/b] ( [b]char[/b] * [b]str[/b], [b]const[/b][b]char[/b] * [b]delimiters[/b] );
  memchr: 在ptr指向的num个存储空间内查找第一个值为value的字节,并返回指向它的指针。
  strchr: 查找str指向字符串中第一个字符为character的位置,返回指向该位置的指针。
  strcspn: 扫描str1字符串,找到首次出现任意str2中字符的位置,返回str1中这个位置前的字符个数。
  strpbrk: 扫描str1字符串,找到首次出现任意str2中字符的位置,返回指向该位置的指针,如找不到,返回NULL。
  strrchr:查找str指向字符串中最后一个字符为character的位置,返回指向该位置的指针。
  strspn: 找出str1中从第一次出现str2中字符开始,连续出现str2中字符的长度,返回该长度。
  strstr: 找出str2中第一次出现str1的位置,返回指向该为止的指针,若不含有,返回NULL。
  strtok: 用法很诡异的一个函数。如下例子。这个函数用于分割字符串,需要循环调用完成分割。循环调用时,传入的字符串为NULL。很好奇这个函数如何实现的:) /* strtok example */
  #include
  #include
  [b]int[/b][b]main[/b] ()
  {
  [b]char[/b][b]str[/b][] ="- This, a sample string.";
  [b]char[/b] * [b]pch[/b];
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  [b]while[/b] (pch != NULL)
  {
  printf ("%s\n",pch);
  pch = strtok (NULL, " ,.-");
  }
  [b]return[/b] 0;
  }
  [b]void[/b] * [b]memset[/b] ( [b]void[/b] * [b]ptr[/b], [b]int[/b][b]value[/b], [b]size_t[/b][b]num[/b] );
  [b]char[/b] * [b]strerror[/b] ( [b]int[/b][b]errnum[/b] );
  [b]size_t[/b][b]strlen[/b] ( [b]const[/b][b]char[/b] * [b]str[/b] );
  memset:从ptr开始,把连续num个字节的内存设置为值value,返回ptr
  strerror: 根据errum,返回一个静态的字符串,这个字符串可以是一些错误提示,都是字符串常量。
  strlen: 返回字符串str的长度。长度通过NULL字符来定位。
  函数strtok很有趣,通过上面的例子可以看到这个函数自身会记录一些变量信息,供下次被调用时使用。记录在哪里?怎么就记录了呢?下面是在glibc中strtok最简单的实现方式.原来只是个全局变量而已:) 有意思。 [b]static[/b][b]char[/b] *[b]olds[/b];
  /* Parse S into tokens separated by characters in DELIM.
  If S is NULL, the last string strtok() was called with is
  used. For example:
  char s[] = "-abc-=-def";
  x = strtok(s, "-"); // x = "abc"
  x = strtok(NULL, "-="); // x = "def"
  x = strtok(NULL, "="); // x = NULL
  // s = "abc\0=-def\0"
  */
  [b]char[/b] *
  [b]strtok[/b] (s, delim)
  [b]char[/b] *[b]s[/b];
  [b]const[/b][b]char[/b] *[b]delim[/b];
  {
  [b]char[/b] *[b]token[/b];
  [b]if[/b] (s == NULL)
  s = olds;
  /* Scan leading delimiters. */
  s += strspn (s, delim);
  [b]if[/b] (*s == '\0')
  {
  olds = s;
  [b]return[/b]NULL;
  }
  /* Find the end of the token. */
  token = s;
  s = strpbrk (token, delim);
  [b]if[/b] (s == NULL)
  /* This token finishes the string. */
  olds = __rawmemchr (token, '\0');
  [b]else [/b]
  {
  /* Terminate the token and make OLDS point past it. */
  *s = '\0';
  olds = s + 1;
  }
  [b]return[/b] token;
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值