c–string.h标准库:
字符串查找
void* memchr(const char* str,int c,size_t n); //(没有memrchr)在str的前n个字节中 搜索第一次出现c 的位置(c为无符号字符)
char* strchr(const char* str, int c); //搜素 在str中第一次出现c的位置(c为无符号字符)
char* strrchr(const char* str, int c); //搜素 在str中最后一次出现c的位置(c为无符号字符)
char* strstr(const char* str1,const char* str2); //在str1中查找第一次出现str2的位置(不包含空结束符)
size_t strcspn(const char* str1,const char* str2); //检索str1 从开头连续有几个字符都不含有 str2中的字符
size_t strspn(const char* str1,const char* str2); //检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。
char* strpbrk(const char*str1,const char*str2); //检查str2是否包含str1(依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置)
char * __cdecl strchr ( constchar * string, int ch )
{
while ( * string && * string != ( char ) ch)
string++ ;
if ( * string == ( char ) ch)
return ( ( char * ) string) ;
return ( NULL ) ;
}
void * my_memchr ( const void * buffer, int ch, int count)
{
while ( count && ( * ( unsigned char * ) buffer != ( unsigned char ) ch) )
{
buffer = ( unsigned char * ) buffer + 1 ;
count-- ;
}
return ( count ? ( void * ) buffer : NULL ) ;
}
#include <stdio.h>
#include <string.h>
int main ( )
{
const char str[ ] = "http://www.runoob.com" ;
const char ch = '.' ;
char * ret;
int pos = 0 ;
ret = ( char * ) memchr ( str, ch, strlen ( str) ) ;
if ( ret != NULL )
printf ( "|%c| 之后的字符串是 - |%s|\n" , ch, ret) ;
ret = strchr ( str, ch) ;
if ( ret != NULL )
printf ( "|%c| 之后的字符串是 - |%s|\n" , ch, ret) ;
pos = strlen ( str) - strlen ( ret) ;
printf ( "子字符串所在的位置 下标 是: %d\n" , pos) ;
ret = strrchr ( str, ch) ;
if ( ret != NULL )
printf ( "|%c| 之后的字符串是 - |%s|\n" , ch, ret) ;
pos = strlen ( str) - strlen ( ret) ;
printf ( "子字符串所在的位置 下标 是: %d\n" , pos) ;
const char needle[ ] = "noob" ;
ret = strstr ( str, needle) ;
if ( ret != NULL )
printf ( "子字符串是: %s\n" , ret) ;
pos = strlen ( str) - strlen ( ret) ;
printf ( "子字符串所在的位置 下标 是: %d\n" , pos) ;
return ( 0 ) ;
}
#include <stdio.h>
#include <string.h>
int main ( )
{
const char str1[ ] = "ABCDEFG019874" ;
const char str2[ ] = "ABCD" ;
int len = strspn ( str1, str2) ;
printf ( "初始段匹配长度 %d\n" , len ) ;
strcpy ( ( char * ) str2, "ABD" ) ;
len = strspn ( str1, str2) ;
printf ( "初始段匹配长度 %d\n" , len ) ;
strcpy ( ( char * ) str2, "BCD" ) ;
len = strspn ( str1, str2) ;
printf ( "初始段匹配长度 %d\n" , len ) ;
len = strcspn ( str1, str2) ;
printf ( "第一个匹配的字符是在 %d\n" , len + 1 ) ;
const char str3[ ] = "abcde2fghi3jk4l" ;
const char str4[ ] = "34" ;
const char * ret1;
ret1 = strpbrk ( str1, str2) ;
if ( ret1 != NULL )
printf ( "第一个匹配的字符是: %c【%s】\n" , * ret, ret) ;
return ( 0 ) ;
}
字符串以分隔符分隔
char* strtok(char* str,const char* delim); //分解str为一组字符串,以delim为分隔符
#include <string.h>
#include <stdio.h>
int main ( )
{
char str[ 80 ] = "This is-www.runoob.com-website" ;
const char s[ 2 ] = "-" ;
char * token;
char * bufTok[ 10 ] = { NULL } ;
token = strtok ( str, s) ;
printf ( "第一次: %s\n" , token ) ;
int i = 0 ;
while ( token != NULL )
{
printf ( "%s\n" , token ) ;
bufTok[ i] = token;
++ i;
token = strtok ( NULL , s) ;
}
return ( 0 ) ;
}
字符串比较
int memcmp(const void* str1,const void* str2,size_t n); //比较str1和str2的前n个字符
int strcmp(const char* str1, const char* str2); //str1与str2进行比较
int strncmp(const char* str1, const char* str2,size_t n); //比较str1和str2的前n个字符
int strcoll(const char* str1, const char* str2); //把 str1 和 str2 进行比较,结果取决于 LC_COLLATE 的位置设置。
#include <string.h>
#include <stdio.h>
int main ( )
{
char str1[ 15 ] = { '\0' } ;
char str2[ 15 ] = { '\0' } ;
int ret;
memcpy ( str1, "abcdef" , 6 ) ;
memcpy ( str2, "ABCDEF" , 6 ) ;
printf ( "str1 %s\n" , str1) ;
printf ( "str2 %s\n" , str2) ;
ret = memcmp ( str1, str2, 5 ) ;
if ( ret > 0 )
printf ( "str2 小于 str1" ) ;
else if ( ret < 0 )
printf ( "str1 小于 str2" ) ;
else
printf ( "str1 等于 str2" ) ;
strcpy ( str1, "ddabcdef" ) ;
strcpy ( str2, "ddABCDEF" ) ;
printf ( "\nstr1 %s\n" , str1) ;
printf ( "str2 %s\n" , str2) ;
ret = strcmp ( str1, str2) ;
if ( ret < 0 )
{
printf ( "str1 小于 str2" ) ;
}
else if ( ret > 0 )
{
printf ( "str1 大于 str2" ) ;
}
else
{
printf ( "str1 等于 str2" ) ;
}
return ( 0 ) ;
}
字符串复制
void* memcpy(void* dest, const void* src, size_t n); //从src复制n个字符到dest
void* memmove(void* dest, const void* src, size_t n); //同上
char* strcpy(char* dest, const char* src); //把src复制到dest
char* strncpy(char* dest, const char* src,size_t n); //把src的前n个字符复制到dest strncpy(str, src+3, 3); 复制下标从3开始的3个字符
void* memset(void* str, int c, size_t n); //将无符号字符c复制到str的前n个字符 (从下标0到n-1,设置str的值为c)(属于字符数组初始化)
size_t strxfrm(char* dest,const char* src,size_t n); //(src复制给dest)根据程序当前的区域选项中的 LC_COLLATE 来转换 src 的前 n 个字符,并把它们放置在 dest 中。
#include <string.h>
#include <stdio.h>
int main ( )
{
const char dest[ ] = "oldstring" ;
const char src[ ] = "newstring" ;
printf ( "Before memmove dest = %s, src = %s\n" , dest, src) ;
memmove ( ( char * ) dest, src, 9 ) ;
printf ( "After memmove dest = %s, src = %s\n" , dest, src) ;
char str[ 50 ] ;
strcpy ( str, "This is string.h library function" ) ;
puts ( str) ;
memset ( str, '$' , 7 ) ;
puts ( str) ;
strxfrm ( str, "给str" , 7 ) ;
puts ( str) ;
return ( 0 ) ;
}
字符串拼接
char* strcat(char* dest, const char* src); //将src追加到dest结尾
char* strncat(char* dest, const char* src, size_t n); //将src追加到dest结尾,追加长度为n
#include <string.h>
#include <stdio.h>
int main ( )
{
char src[ 50 ] , dest[ 50 ] ;
strcpy ( src, "This is source" ) ;
strcpy ( dest, "This is destination" ) ;
strcat ( dest, src) ;
printf ( "最终的目标字符串: |%s|" , dest) ;
return ( 0 ) ;
}
错误信息
char *strerror(int errnum); //从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。
#include <string.h>
#include <stdio.h>
int main ( )
{
FILE * fp;
fp = fopen ( "file.txt" , "r" ) ;
if ( fp == NULL )
{
printf ( "Error: %s\n" , strerror ( errno) ) ;
}
return ( 0 ) ;
}
字符串长度
size_t strlen(const char* str); //计算str的长度,直到空结束符,不包括结束符
#include <string.h>
#include <stdio.h>
int main ( )
{
char str[ 50 ] ;
int len;
strcpy ( str, "This is runoob.com" ) ;
len = strlen ( str) ;
printf ( "|%s| 的长度是 |%d|\n" , str, len) ;
return ( 0 ) ;
}