当前位置: 代码迷 >> 综合 >> 【C进阶】字符串函数(strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror)
  详细解决方案

【C进阶】字符串函数(strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror)

热度:37   发布时间:2023-11-26 15:39:04.0

目录

前言:

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

        有空再讲。

总结

        勤加练习。