参考了许多网上的资料,有些并不一定就是源码,但是原理是相同的
1. strcpy函数(strncpy)
strcpy(dest,src)
复制源串strSource到目标串strDestination所指定的位置, 包含NULL结束符. 不能处理源串与目标串重叠的情况.
函数返回strDestination值.
源码:
char *strcpy(char *strDes, const char *strSrc) {
//assert用以检测是否为空,通过assert处理异常来返回NULL
assert((strDes != NULL) && (strSrc != NULL));
char *address = strDes;
//一个个字符地将 source 字串赋值给 destination 字串
while ((*strDes ++ = *strSrc ++) != '\0')
NULL;
return address;
}
- 关键点:assert判断有效性;NULL结束符。
其实,可以不用指针变量address,只需返回strDes即可。
2. strncpy函数
strncpy(dest,src,count); 将str2中最前面的n个字符复制到str1中去,覆盖str1的最前面的n个字符
当n>=sizeof(src)时,拷贝正确,并在dest字符串后面加入’\0’;
当n<sizeof(src)时,只拷贝src前n-1个字符串到dest,不会为dest字符串后面加入’\0’;
char * strncpy (dest, source, count)
//char *dest, *source;
//unsigned count;
{
char *start = dest;
while (count && (*dest++ = *source++))
count--;
if (count)//n>=sizeof(src)时,source拷贝完了,给dest补'\0'
//如果count>0,'\0'已写入,不够的字符数都填充'\0'
while (--count)
*dest++ = '\0'; //继续写dest指向的字符
return(start);
}
3. strcmp函数
字符串比较的规则是:将两个字符串从左到右诸葛字符比较(按ASCII码值大小比较),知道出现不同的字符或遇到‘\0’为止. –>strcmp(str1,str2)
str1==str2,函数值为0
str1>str2,函数值为正整数
str1<str2,函数值为负整数
int strcmp(const char *s, const char *t) {
assert(s != NULL && t != NULL); //断言s和t都不等于null
//遍历字符串中的每一个字符,当字符不同时跳出循环
while (*s && *t && *s == *t)
{
++ s;
++ t;
}
return (*s - *t);
}
4. strrev函数
将字符串string中的字符顺序颠倒过来. NULL结束符位置不变. 返回调整后的字符串的指针。–>strrev(str)
//其基于的思想是:只是通过指针将元素的位置颠倒即可。
char *strrev(char *str)
{
assert(str != NULL);
char *st,*et;
char tmpCh;
st=et=str;
while(*et!='\0') ++et;
//用2个指针st和et同时从首位一起遍历到中点进行翻转
for(--et,st;st<et;++st,--et)
{
tmpCh=*st;
*st=*et;
*et=tmpCh;
}
return str;
}
5. strcat函数
strcat(), 字符串的连接. –>strcat(str1,str2)
char *strcat(char *target,const char *source)
{
char *original=target;
while(*target) target++; //找到source字符串的末尾的位置
while(*target++=*source++);
return(original);
}
6. strlen函数
strlen(),计算字符串长度
int strlen(const char string)
{
int i=0;
while(string[i]) i++; //说明'\0'的ASIIC码为0
return i;
}
6. chrcnt函数
chrcnt(), 计算某个字符在字符串中出现的次数.
int chrcnt(const char *string,int letter)
{
int count=0;
while(*string)
if(*string==letter)count++;
return count;
}
6. strlwr,strupr函数
strlwr(str) 转换为小写 string loweRcase
strupr(str) 转换为大写 string uppeRcase
char * strlwr(char *str)
{
char *p = str;
while (*p != '\0')
{
if(*p >= 'A' && *p <= 'Z')
*p = (*p) + 0x20; //0x20==32
p++;
}
return str;
}
/***************************/
char* strupr(char* src)
{
while (*src != '\0')
{
if (*src >= 'a' && *src <= 'z')
//在ASCII表里大写字符的值比对应小写字符的值小32.
//*p -= 0x20; // 0x20的十进制就是32
*src -= 32;
src++;
}
return src;
}
Reference:
C语言字符串函数源码详解
C 语言中操作字符串的一些函数源代码
字符串函数—strcpy()与strncpy()详解及实现
strupr与strlwr函数的实现