1.strlen:求字符串长度
>直接用计算器实现:
int my_strlen(const char *str)
{
int count = 0;
while (*str){
count++;
str++;
}
return count;
}
>不创建临时变量的计数器:通过递归
int my_strlen(const char *str)
{
if (*str=='\0'){
return 0;
}
else
return 1 + my_strlen(str + 1);
}
>指针-指针:
int my_strlen(const char *str)
{
char *p = str; //p指向首元素
while (*p != '\0'){
p++;
}
return p - str;
}
2.strcpy和strncpy:字符串拷贝:
>strcpy:将str1串复制到str2串中
char *my_strcpy(char *dest, const char *str)
{
assert(dest);
assert(str);
while (*dest = *str){
dest++;
str++;
}
return dest;
}
>strncpy:将字符串str1中指定长度复制到字符串2中:
如果指定长度大于串str1的长度,则拷贝完后再串str2后补0,直到和指定长度相等。
char *my_strncpy(char *dest,const char*str,int size)
{
assert(dest);
assert(str);
assert(size > 0);
while (size--){
*dest = *str;
dest++;
str++;
}
*dest = '\0';
return dest;
}
3.strcat和strncat:字符串拼接:
先使被拼接的字符串(dest)指向'\0',然后将要拼接的字符串(str)依次拷贝到dest后。
>strcat函数:
char *my_strcat(char *dest, const char *str)
{
char *ret =dest;
assert(dest);
assert(str);
while (*dest){
dest++;
}
while (*dest = *str){
dest++;
str++;
}
return ret;
}
>strncat函数:将字符串str1中指定长度拼接到字符串2中。
char *my_strncat(char*dest,const char *str,int size)
{
assert(dest);
assert(str);
assert(size > 0);
while (*dest){
dest++;
}
while (size && (*dest =*str)){
dest++;
str++;
size--;
}
return dest:
}
4.strcmp和strncmp:字符换比较:
通过字符在ASCLL表中的位置序号进行差运算比较。比较的是ASCLL中的位置:如abcg小于abcz。
>strcmp函数:
int my_strcmp(const char *str1,const char *str2)
{
int ret = 0;
while ((!(ret = *(unsigned char*)str1 - *(unsigned char*)str2)&&str1)) //一相等为基础
{
str1++;
str2++;
}
if (ret > 0)
ret = 1;
else if (ret<0)
ret = -1;
return (ret);
}
>strncmp函数:
比较出现另一个字符不一样或者一个字符串结束或者size个字符全部比较完。
int my_strncmp(const char *dest,const char *str,int size)
{
assert(dest);
assert(str);
assert(size > 0);
int ret;
while (size&&(!(ret=*dest-*str))){
dest++;
str++;
size--;
}
return ret > 0 ? 1 : ret < 0 ? -1 : 0;
}
5.strstr:查找并返回子串。
在str1中查找str2并返回,str1中str2所在字符串之后的所有字符串。定义一个指针变量s指向str1,然后s与str2中的字符进行比较,如果一直比较到'\0'那么就返回str1,如果比较遇到不相等,则s指向str1的第二个字符重新开始比较。
char *my_strstr(char *str1, const char *str2)
{
assert(str1);
assert(str2);
char *p = (char*)str1;
char *q = (char *)str2;
char *s = NULL;
while (*p){
s = p;
q = str2;
while (*s&&*q && (*s == *q)){
s++;
q++;
}
if (*q == '\0')
return p;
p++;
}
return 0;
}
6.strchr和strrchr:查找某个字符出现的位置。
>strchr函数:查找第一次字符出现的位置如果字符出现多次,以第一次找到的位置为主。
#include<stdio.h>
#include<Windows.h>
#include<assert.h>
char *my_strchr(const char*str, int c)
{
assert(str);
while (*str){
if (*str == (char)c){
return (char*)str;
}
str++;
}
return 0;
}
int main(){
char *str1 = "abcdef";
char c = 'd';
char *ret = my_strchr(str1,c); //返回的是当前字符的位置
printf("%d\n", ret-str1+1); //找到字符的位置减去首元素的位置加1就是当前字符在字符串中的位置
system("pause");
return 0;
}
>strrchr:查找字符最后一次出现的位置并返回位置;从后往前找。
#include<stdio.h>
#include<Windows.h>
#include<assert.h>
char *my_strrchr(const char *dest, int c)
{
assert(dest);
char *str = dest + strlen(dest);
while (str--){
if (*str == (char)c){
return (char*)str;
break;
}
}
}
int main(){
char *str = "holle world i love chnia";
int c = 'd';
char*p=my_strrchr(str, c);
printf("%d\n", p - str + 1);
system("pause");
return 0;
}
7.strpbrk:返回第一个字符串中第一个出现在第二个字符串中的字符的地址。
char *my_strpbrk(const char *str1, const char *str2)
{
assert(str1);
assert(str2);
const char *p1, *p2;
for (p1 = str1; *p1 != '\0'; p1++)
{
for (p2= str2; *p2 != '\0'; p2++)
{
if (*p1 == *p2)
{
return (char *)p1;
}
}
}
return NULL;
}
8.strspn和strcspn:
>strspn函数检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。
返回的是str1字符串中开始部分匹配str2字符串中字符的个数
int my_strspn(const char*str1, const char *str2)
{
assert(str1);
assert(str2);
char *str = str1;
while (*str){
while (*str2 && (*str != *str2))
str2++;
if (*str == *str2)
break;
str++;
}
return str - str1;
}
>strcspn: 检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符。
返回 str1 开头连续都不含字符串 str2 中字符的字符数.
int my_strspn(const char*str1, const char *str2)
{
assert(str1);
assert(str2);
char *str = str1;
while (*str&&*str != *str2){
str2++;
str++;
}
return str - str1;
}
9.模拟实现strtok:
(1)sep参数是个字符串,定义了用作分隔符的字符集合
(2)第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
(3)strtok函数找到str中的下一个标记,并将其用’\0’结尾,返回一个指向这个标记的指针。
(4)strtok函数的第一个参数不为NILL,函数找到str中第一个标记,strtok函数将保存它在字符串中的位置。
(5)strtok函数的第一个参数为空,函数将在同一个字符中被保存的位置开始,查找下一个标记。
(6)如果字符串不存在更多的标记,则返回NULL指针。
#include<stdio.h>
#include<Windows.h>
#include<string.h>
int main(){
char str[] = "- this, a sample string.";
char *sep = "- ,.";
char *p = strtok(str, sep);
while (p != NULL){
printf("%s\n", p);
p = strtok(NULL, sep);
}
system("pause");
return 0;
}
10.strerror:通过标准错误的标号,获得错误的描述字符串 ,将单纯的错误标号转为字符串描述,方便用户查找错误。
返回错误码所对应的错误信息
#include<stdio.h>
#include<Windows.h>
#include<string.h>
#include<errno.h>
#pragma warning( disable : 4996)
int main(){
FILE *pFile;
pFile = fopen("unexist.ent", "r");
if (pFile == NULL){
printf("Error opean file unexist.ent:%s\n", strerror(errno));
}
system("pause");
return 0;
}