C标准库文件之string.c文件
String.h头文件中定义许多常用的字符串操作函数
类型:
size_t
宏:
NULL,用来初始化指针
函数:
原型:
#include <string.h>
void* memcpy(void* s1, const void* s2, size_t n);
描述:
复制s2所指对象的n个字节到s1;对于s1与s2重叠的问题没有处理
返回值:
返回s1
源码:
void* memcpy(void* s1, const void* s2, size_t n)
{
char* su1;
const char* su2;
for(su1 = s1, su2 = s2; 0 < n; ++su1, ++su2, --n)
*su1 = *su2;
return s1;
}
原型:
#include<string.h>
void*memmove(void* s1, const void* s2, size_t n);
描述:
复制s2所指对象的n个字节到s1;对s1与s2重叠的问题进行了处理
返回值:
返回s1
源码:
void* memmove(void* s1, const void* s2, size_t n)
{
char* sc1;
const char* sc2;
sc1 = s1;
sc2 = s2;
if(sc2 < sc1 && sc1 < sc2 + n) //即sc1位于sc2与sc2 + n之间
for(sc1 += n, sc2 += n; 0 < n; --n) //从后往前复制,以免覆盖sc2的字节
*--sc1 = *--sc2;
else
for( ; 0 < n; --n)
*sc1++ = *sc2++;
return s1;
}
原型:
#include<string.h>
void*memset(void* s1, int c, size_t n)
描述:
将c复制到s1所指的内存的n个字节
返回值:
返回s1;
源码:
void* memset(void* s, int c, size_t n)
{
const unsigned char uc = c;
unsigned char* su = s;
for(su = s; 0 < n; ++su, --n)
*su = uc;
return s;
}
原型:
#include<string.h>
int memcmp(const void *s1, const void*s2, size_t n);
描述:
比较s1与s2的前n个字符
返回值:
如果s1 < s2,则返回值小于0;
如果s1 == s2;则返回值等于0;
如果s1 > s2;则返回值大于0
源码:
int memcmp(const void* s1, const void* s2, size_t n)
{
const unsigned char *su1, *su2;
for(su1 = s1, su2 = s2; 0 < n; ++su1, ++su2, --n)
if(*su1 != *su2)
return ((*su1 < *su2) ? -1: +1;
return 0;
}
原型:
#include<sting.h>
void*memchr(const void* s, int c, size_t n);
描述:
在s中的前n个字符中查找c出现的第一个位置,该方法将c转换成unsignedchar类型
返回值:
返回查找到的第一个位置的指针,否则返回NULL;
源码:
void* memchr(const void* s, int c, size_t n)
{
const unsigned char uc = c;
const unsigned char* su;
for(su = s; 0 < n && *s != '\0'; ++su, --n)
if(*su == uc)
return (void*)su;
return NULL;
}
原型:
#include<string.h>
char*strcpy(char* s1, const char* s2)
描述:
将字符串s2复制到s1中,如果s1与s2的区域重叠,则该行为未定义
返回值:
返回s1
源码:
char* strcpy(char* s1, const char* s2)
{
char* s;
for(s = s1; (*s1++ = *s2++) != '\0'; );
return s1;
}
原型:
#include<string.h>
char*strncpy(char* s1, const char* s2, size_t n)
描述:
将字符串s2的前n个字符复制到s1中,如果s1与s2的区域重叠,则该行为未定义;
如果字符串s2的长度小于n,则用’\0’填充s1至n个字符。
返回值:
返回s1
源码:
char* strncpy(char* s1, const char* s2, size_t n)
{
char* s;
for(s = s1; 0 < n && *s2 != '\0'; --n)
*s++ = *s2++;
for(; 0 < n; --n)
*s++ = '\0';
return s1;
}
原型:
#include<string.h>
char*strcat(char* s1, const char* s2)
描述:
将字符串s2拼接到s1的尾部,并且会覆盖s1字符串的’\0’.如果s1与s2的区域重叠,则该行为未定义
返回值:
返回s1
源码:
char* strcat(char* s1, const char* s2)
{
assert(s1 != NULL && s2 != NULL);
if(s1 == NULL || s2 == NULL) return NULL;
char* s;
for(s = s1; *s != '\0'; ++s);
for(; (*s = *s2) != '\0'; ++s, ++s2);
return s1;
}
原型:
#include<string.h>
char*strncat(char* s1, const char* s2, size_t n)
描述:
将字符串s2前n个字符拼接到s1的尾部,并且会覆盖s1的’\0’,如果s1与s2的区域重叠,则该行为未定义
返回值:
返回s1
源码:
char* strncat(char* s1, const char* s2, size_t n)
{
char *s;
for(s = s1; *s != '\0'; ++s);
for( ; 0 < n && *s2 != '\0'; --n)
*s++ = *s2++;
*s = '\0';
return s1;
}
原型:
#include<string.h>
intstrcmp(char* s1, const char* s2)
描述:
比较字符串s1和s2
返回值:
如果s1 > s2,则返回值大于0;
如果s1 == s2,则返回值等于0;
否则,返回值小于0
源码:
int strcmp(const char* s1, const char* s2)
{
for(; *s1 == *s2; ++s1, ++s2)
if(*s1 == '\0')
return 0;
return *(unsigned char*)s1 < *(unsigned char*)s2 ? -1 : 1;
}
原型:
#include<string.h>
char*strchr(char* s, int c)
描述:
找出c(转化为char型)在字符串s中第一次出现的位置,’\0’被当做字符串的一部分
返回值:
返回c在字符串s中第一次出现的位置,或者返回NULL
源码:
char* strchr(const char* s, int c)
{
const char ch = c;
for(; *s != ch; ++s)
if(*s == '\0')
return NULL;
return (char*)s;
}
原型:
#include<string.h>
char*strrchr(char* s, int c)
描述:
找出c(转化为char型)在字符串s1中最后一次出现的位置,’\0’被当做字符串的一部分
返回值:
返回c在字符串s中最后一次出现的位置,或者返回NULL
源码:
char* strrchr(const char* s, int c)
{
const char ch = c;
const char *sc;
for(sc = NULL; ; ++s)
{
if(*s == ch)
sc = s;
if(*s == '\0')
return (char*)sc;
}
}
原型:
#include<string.h>
char*strstr(const char* s1,const char* s2)
描述:
找出字符串s2在字符串s1中第一次出现的位置
返回值:
返回s2在字符串s1中第一次出现的位置,或者返回NULL
源码:
char* strstr(const char* s1, const char* s2)
{
if(*s2 == '\0')
return (char*)s1;
for(; (s1 = strchr(s1, *s2)) != NULL; ++s1)
{
const char *sc1, *sc2;
for(sc1 = s1, sc2 = s2; ;)
if(*++sc2 == '\0')
return (char*)s1;
else if(*++sc1 != *sc2)
break;
}
return NULL;
}
原型:
#include<string.h>
char*strerror (int errornum)
描述:
查找错误代码errornum对应的string消息
返回值:
返回该string消息的指针
源码:
|
原型:
#include<string.h>
Size_t*strlen(char* s)
描述:
计算字符串s的长度,不包含字符串结束符’\0’
返回值:
返回字符串s的长度,该长度不包含字符串结束符’\0’
源码:
size_t strlen(const char* s)
{
const char* sc;
for(sc = s; *sc != '\0'; ++sc);
return sc - s;
}