字符串的库函数使用和实现(二)
前言
本文将介绍有长度限制的字符串函数及字符串查找函数,报错误信息的库函数
一、带长度的字符串函数
1、strncpy函数
(1)库函数
首先看下C语言库中对该函数的定义,char *strncpy( char *strDest, const char *strSource, size_t count );
和strcpy基本上是相同的,唯一就是多加了个函数参数多了个复制的长度。该发生在重叠字符串则行为是未定义的。
那么来看看该函数的实现
其实看到这个函数大家都有个疑问,如果要传递的长度比源字符串长怎么办?看以下代码
//正常使用
#include<string.h>
#include<stdio.h>
int main()
{
char arr1[20] = "abcdefg";
char arr2[] = "xxxxx";
strncpy(arr1, arr2, 3);
printf("%s", arr1);
return 0;
}
//
#include<string.h>
#include<stdio.h>
int main()
{
char arr1[20] = "abcdefg";
char arr2[] = "xxxxx";
strncpy(arr1, arr2, 6); //很明显源字符串只有五个,那么是不是就会报错呢?
printf("%s", arr1);
return 0;
}
正常使用的情况:
就是会直接将源字符串的前num个元素拷贝到目标字符串
如果不够的情况:
如果源 C 字符串的末尾(由 null 字符表示)在复制 num 字符之前找到(当传递的个数多于源字符串长度时),destination 用零填充,直到写入总共 num 个字符。(就会用0来填充,直到写入了num个字符)
(2)实现
和之前讲的strcpy的实现方法基本相同的,要多加一个传递的字符串长度
看以下代码
#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* src, int num)
{
assert(dest && src);
char* start = dest;
while (num--)
{
*dest++ = *src++;
if (*src == '\0')
break;
}
if (*src == '\0')
{
while (num--)
{
*dest++ = '\0';
}
}
return start;
}
int main()
{
char arr1[20] = "abcefg";
char arr2[] = "xxxxx";
int k = 0;
scanf("%d", &k);
printf("%s\n", my_strncpy(arr1, arr2, k));
return 0;
}
2、strncat函数
(1)库函数
首先看下C语言中库函数的定义
char *strncat( char *strDest, const char *strSource, size_t count );
和之前(一)讲的strcat是一样的,
首先还是那个问题,就是我如果源字符串长度小于传递的字符串怎么办?
那么C语言库函数规定,如果 count 大于 strSource 的长度,则使用 strSource 的长度代替 count。生成的字符串以 null 字符结尾。
看两个代码
正常使用
#include<string.h>
#include<stdio.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
printf("%s\n", strncat(arr1, arr2, 3));
return 0;
}
超出范围
#include<string.h>
#include<stdio.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
printf("%s\n", strncat(arr1, arr2, 3));
return 0;
}
(2)实现
#include<stdio.h>
char* my_strncat(char* dest, char* src, int num)
{
char* start = dest;
while (*dest)
{
dest++;
}
while (num--)
{
*dest++ = *src++;
if (*src == 0)
break;
}
return start;
}
int main()
{
char arr1[20] = "hello";
char arr2[] = "world";
int k = 0;
scanf("%d", &k);
printf("%s\n", my_strncat(arr1, arr2, k));
return 0;
}
3、strncmp函数
(1)库函数
首先C语言中库函数的介绍 int strncmp( const char *string1, const char *string2, size_t count );这个就比较简单了,看使用代码
#include<string.h>
#include<stdio.h>
int main()
{
char arr1[] = "abcdefg";
char arr2[] = "abllo";
printf("%d\n", strncmp(arr1, arr2, 2));
return 0;
}
(2)实现
#include<stdio.h>
#include<assert.h>
int my_strncmp(const char* dest, const char* src, int num)
{
assert(dest && src);
int signel = 0;
while (num--)
{
if (*dest != *src)
{
signel = 1;
break;
}
dest++;
src++;
}
if (signel == 1)
{
if (*dest > *src)
return 1;
else
return -1;
}
else
return 0;
}
int main()
{
char arr1[] = "hezlo";
char arr2[] = "herld";
int k = 0;
scanf("%d", &k);
printf("%d\n", my_strncmp(arr1, arr2, k));
return 0;
}
二、字符串的查找
1、strstr函数
首先来看C语言中库函数的定义,char *strstr( const char *string, const char *strCharSet );
Each of these functions returns a pointer to the first occurrence of strCharSet in string, or NULL if strCharSet does not appear in string. If strCharSet points to a string of zero length, the function returns string.
这个函数是这样使用的,strCharSet这个是要找的字符串,在string里找这个字符串,如果找到了,返回第一次出现strCharset的指针,如果没找到,就返回空指针。如果要找的字符串指向长度为0的字符串,则返回string。
(1)使用
#include<string.h>
#include<stdio.h>
int main()
{
char arr1[] = "abcdabcdabcd";
char arr2[] = "bcdz";
printf("%s\n", strstr(arr1, arr2));
return 0;
}
(2)实现
实际上这个代码实现需要两步,比方说我是在dest这个数组里找src这个字符串,首先需要一个遍历dest数组的指针,还需要一个记录位置的指针。第二,需要一个遍历src字符串的指针,还需要一个记录起始位置的指针,然后一个一个对比,最后返回dest记录位置的指针就好了。
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* dest, const char* src)
{
assert(dest && src);
if (*src == '\0')
return (char*)dest;
while (*dest)
{
char* point = (char*)dest;
char* find = (char*)src;
while (*point && *find && *point == *find)
{
point++;
find++;
}
if (*find == '\0')
return (char*)dest;
else
dest++;
}
return NULL;
}
int main()
{
char arr1[] = "abcddcbaabcc";
char arr2[] = "z";
if (my_strstr(arr1, arr2) != NULL)
printf("%s\n", my_strstr(arr1, arr2));
else
printf("找不到了\n");
return 0;
}
2、strtok函数
首先来看C语言中库函数的讲解,char *strtok( char *strToken, const char *strDelimit );
All of these functions return a pointer to the next token found in strToken. They return NULL when no more tokens are found. Each call modifies strToken by substituting a NULL character for each delimiter that is encountered.
是这个意思,strtok实际上是根据strdelimit这里面的分隔符来分割这个strToken这个字符串,它每次会返回找到下一个分隔符前的指针,当找不到更多分隔符会返回NULL,下次传递NULL,就是传递上个分隔符最后的位置,看一下代码
#include<string.h>
#include<stdio.h>
int main()
{
char arr1[] = "316373012@qq.com";
char arr[30];
strcpy(arr, arr1);
char* sep = ".@";
char* str = strtok(arr, sep);
while (str != NULL) //当返回值就是空指针了,说明所有的分隔符找完了
{
printf("%s ", str);
str = strtok(NULL, sep);//NULL是记录之前最后一个分隔符的位置,会从这个位置往后找下一个分隔符
}
return 0;
}
三、错误信息报告
1、strerror及perror
strerror是报告上一个错误的原因,返回错误码,输出错误原因
看两个代码:
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
FILE * pFile;
pFile = fopen("unexist.ent", "r"); //阅读这个文件,但实际上这个文件并没有创建
if (pFile == NULL)
printf("error:%s", strerror(errno)); //会输出错误原因
//errno: Last error number
return 0;
}
perror使用方法更简单,看以下代码:
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
FILE * pFile;
pFile = fopen("unexist.ent", "r");
if (pFile == NULL)
perror("error");
//errno: Last error number
return 0;
}
总结
本文详细讲解了C语言库函数中带长度的字符串函数及字符串查找函数,如果喜欢,还请点上屏幕上的赞支持一下博主,本文点赞过30个,2天后更新C语言库函数中内存 操作函数。