目录
前言:
1.字符串函数
1.0 参数检查
1.1 strlen
1.2 strcpy
1.3 strcat
1.4 strcmp
1.5 strncpy、strncat、strncmp
1.6 strstr
1.7 strtok
1.10 strerror
总结
前言:
主要介绍的函数有strlen strcpy strcat strcmp strncpy strncat strncmp strstr strtok strerror
1.字符串函数
1.0 参数检查
我们在编程的时候,我们要时刻注意对参数的检查。常用的方法有两种,首先是使用if...else来判断(这样程序不会崩溃,可以继续运行)。使用断言(assert)(程序会崩溃,及时止损)具体的用法见后面的代码。具体在什么时候使用哪种方法,我们需要视情况而定。
1.1 strlen
函数的意义是求字符串的长度,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。注意函数的返回值为size_t,是无符号的。函数的实现如下:
#include <stdio.h>
#include <assert.h>size_t myStrlen(const char* str){assert(str!=NULL); //当str=NULL时抛出异常,程序崩溃size_t len=0;while(str[len]!='\0'){len++;}return len;
}
int main()
{char str[]="abcdef";printf("%d\n",myStrlen(str));return 0;
}
1.2 strcpy
字符串拷贝。源字符串必须以 '\0' 结束,并且会将源字符串中的 '\0' 拷贝到目标空间。 目标空间必须足够大,以确保能存放源字符串。函数的实现如下:
#include <stdio.h>
#include <assert.h>char* myStrcpy(char* dest,char* src){assert(dest!=NULL);assert(src!=NULL);int i=0;while(src[i]!='0'){dest[i]=src[i];i++;}dest[i]='\0';return dest;
}
int main()
{char str[]="abcdef";char str1[1024]={0};myStrcpy(str1,str);printf("%s\n",str1);return 0;
}
1.3 strcat
字符串拼接。源字符串必须以 '\0' 结束,目标空间必须有足够的大,能容纳下源字符串的内容。并且目标空间必须可修改。函数实现如下:
#include <stdio.h>
#include <assert.h>char* myStrcat ( char* dest, const char* src ){assert(dest!=NULL);assert(src!=NULL);int i=0;while(dest[i]!='\0'){i++;}int j=0;while(src[j]!=0){dest[i+j]=src[j];j++;}dest[i+j]='\0';return dest;
}
int main()
{char str1[1024]="hello";char str2[1024]="world";myStrcat(str1,str2);printf("%s\n",str1);return 0;
}
1.4 strcmp
字符串的比较。比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
return value indicates <0
the first character that does not match has a lower value in ptr1 than in ptr2 0
the contents of both strings are equal >0
the first character that does not match has a greater value in ptr1 than in ptr2
#include <stdio.h>
#include <assert.h>int myStrcmp ( const char * str1, const char * str2 ){assert(str1!=NULL);assert(str2!=NULL);while(*str1 != '\0' && *str2 != '\0'){if(*str1<*str2){return -1;}else if(*str1>*str2){return 1;}else{str1++;str2++;}}if(*str1<*str2){return -1;}else if(*str1>*str2){return 1;}else{return 0;}
}
int main()
{char str1[1024]="hello";char str2[1024]="world";printf("%d\n",myStrcmp(str1,str2));return 0;
}
1.5 strncpy、strncat、strncmp
strncpy、strncat就是多加了一层限制。通过n限制最大拷贝的个数,从而避免越界的情况。(仍然很鸡肋)。
strncmp则是比较两个字符串的前n个。
1.6 strstr
判定str2字符串是否时str1字符串的子串。如果找到就返回所在的下标的指针,如果找不到就返回NULL.实现方法如下:
#include <stdio.h>
#include <assert.h>const char * myStrstr ( const char * str1, const char * str2 ){assert(str1!=NULL);assert(str2!=NULL);assert(*str1 != '\0');assert(*str2 != '\0');const char* black= str1;while(*black!='\0'){const char* red= black;const char* sub= str2;while(*red!='\0' && *sub != '\0' && *red == *sub){red++;sub++;}if(*red=='\0'){black++;}else if(*sub=='\0'){return black;}else{//*red!=*subblack++;}}return NULL;
}
int main()
{char str1[1024]="hello";char str2[1024]="el";printf("%p\n",myStrstr(str1,str2));return 0;
}
1.7 strtok
char * strtok ( char * str, const char * sep );
sep参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回 NULL 指针。
其用法如下:
/* strtok example */
#include <stdio.h>
#include <string.h>int main ()
{char str[] ="- This, a sample string.";char * pch;printf ("Splitting string \"%s\" into tokens:\n",str);pch = strtok (str," ,.-");while (pch != NULL){printf ("%s\n",pch);pch = strtok (NULL, " ,.-");}return 0;
}
1.10 strerror
有空再讲。
总结
勤加练习。