目录
前言:
主要介绍的函数有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!=*sub
black++;
}
}
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
有空再讲。
总结
勤加练习。