目录
strlen函数-求字符串长度
功能:strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。
头文件: <string.h>
返回值:字符串长度(不包括\0)
返回值类型:unsigned int (size_t)
函数原型:size_t strlen (const char *s)
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "aaaaa";
char brr[] = { 'a','a','q'};
printf("%d\n", strlen(arr));//5
printf("%d\n", sizeof(arr));//6
printf("%d\n", strlen(brr));//随机值
printf("%d\n", sizeof(brr));//3
return 0;
}
模拟实现strlen函数
方法1:创建临时变量
#include<stdio.h>
int my_strlen(char *arr)
{
int count = 0;
while (*arr++ != '\0')
count++;
return count;
}
int main()
{
char arr[] = { 'a','b' };
printf("%d", my_strlen(arr));
return 0;
}
方法2:要求不可以创建临时变量 使用递归
#include<stdio.h>
int my_strlen(char *arr)
{
if (*arr == '\0')
return 0;
else
return 1 + my_strlen(arr+1);//arr+1指向'y'
}
int main()
{
char arr[] = "qyq";
printf("%d", my_strlen(arr));
return 0;
}
方法3:使用指针 :
指向同一内存的两个指针:指针-指针得到两个指针之间的元素个数
#include<stdio.h>
int my_strlen(char *arr)
{
char* p = arr;
while (*p != '\0')
p++;
return p - arr;
}
int main()
{
char arr[] = "\0";
printf("%d", my_strlen(arr));
return 0;
}
strcpy函数-字符串复制函数
原型声明:char *strcpy(char* dest, const char *src);
头文件:#include <string.h>
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回值:指向dest的指针。
要求:dest有足够空间;src含有\0,拷贝过程中也会把src的\0拷贝过去;src和dest所指内存区域不可以重叠。
#include<stdio.h>
#include<string.h>
int main()
{
//char dest[] = "qw";//报错:dest只有3个字节,str有4个字节
//char str[] = { 'e','u' };//报错:str没有结束标志
char dest[10] = "qw";
char str[] = "feu";
printf("%s", strcpy(dest, str));
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* str, size_t n)
{
assert(dest && str);
size_t i = 0;
char* ret = dest;
while (i < n && (*dest++ = *str++))
{
i++;
}
return ret;
}
int main()
{
char str[20] = "qwer";
char* arr = "gyyyyy";
my_strncpy(str, arr, 2);
printf("%s ", str);
return 0;
}
strcat-字符串连接函数
功能:把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
函数原型:char * strcat ( char * destination, const char * source );
头文件:string.h
要求:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串;src中需要包括'\0'。
返回值:指向dest的指针
#include<stdio.h>
#include<string.h>
int main()
{
//char arr[] = "qwe";//error;arr的长度不足
//char brr[] = { 'u','i'};//brr没有'\0'
char arr[10] = "qwe";
char brr[] = "ui";
strcat(arr, brr);
printf("%s", arr);
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
char* my_stract(char* arr, const char* brr)
{
assert(arr && brr);
char *ret=arr;
while (*arr)
arr++;
while (*arr++ = *brr++)//从arr的'\0'以后更改为brr的值
;
return ret;
}
int main()
{
char arr[10] = "wer";
char brr[] = "op";
my_stract(arr, brr);
printf("%s", arr);
return 0;
}
strcmp函数-比较函数
功能:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
头文件:string.h
返回值:当s1<s2时,返回为负数;当s1=s2时,返回值= 0;当s1>s2时,返回正数。
函数原型:int strcmp(const char*s1,const char*s2);
#include<stdio.h>
#include<string.h>
int main()
{
//char arr[] = "qwe";
//char arr[] = "qw";
char arr[] = "qweu";
int ret=strcmp(arr, "qwe");
printf("%d", ret);
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* s1, const char* s2)
{
assert(s1 && s2);
while (*s1 == *s2 &&*s1!='\0')
{
s1++;
s2++;
}
return *s1 - *s2;
}
int main()
{
char arr[10] = "qwe";
int ret = my_strcmp(arr, "qwey ");
if (ret < 0)
printf("<\n");
else if (ret > 0)
printf(">\n");
else
printf("=\n");
return 0;
}
strncpy-字符复制函数
功能:函数用于将指定长度的字符串复制到字符数组中,
函数原型:char *strncpy(char *dest, const char *src, size_t n),表示把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest。
返回值:char*
要求:dest数组的长度要足够大
#include<stdio.h>
#include<string.h>
int main()
{
char arr[10] = "qwe";
char brr[] = "12";
//strncpy(arr, brr, 10);//arr:1 2 \0
//strncpy(arr, brr, 3);//arr:1 2 \0
//strncpy(arr, brr, 1);//将1传入,1we;
//char str[] = "12345678912";
//strncpy(arr, str, 10);//报错:str的长度长于arr
char str[] = "1234567\08912";//遇到\0了 1234567
strncpy(arr, str, 10);
printf("%s", arr);
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* s, char* p, size_t n)
{
assert(s && p);
char*ret=s;
size_t i = 0;
while (i++ < n && *p!='\0')
*s++ = *p++;
return ret;
}
int main()
{
char arr[10] = "qi";
char str[] = "1282";
my_strncpy(arr, str, 3);
printf("%s", arr);
return 0;
}
strncat函数-字符连接函数
原型:char * strncat(char *dest, const char *src, size_t n);
功能:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的'\0'),再追加'\0'。
说明:src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的字符串。
返回值:返回指向dest的指针。
#include<stdio.h>
#include<string.h>
int main()
{
char arr[10] = "qi";
char str[] = "1282";
strncat(arr, str, 2);//qi12
strncat(arr, str, 4);//qi1282
printf("%s", arr);
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
char* my_strncat(char* s, const char* p, size_t n)
{
char*ret=s;
assert(s && p);
size_t i = 0;
while (*s)
s++;
while (i++ < n && *p!='\0')
*s++ = *p++;
*s='\0';
return ret;
}
int main()
{
char arr[10] = "qi";
char str[] = "128\02";
my_strncat(arr, str, 4);//qi128
printf("%s", arr);
return 0;
}
strncmp-字符串比较函数
函数声明:int strncmp(const char *str1, const char *str2, size_t n)
函数返回值:正数 负数 0
函数功能:指定比较size个字符,把 str1 和 str2 进行比较,最多比较前 n 个字节,若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "qwaery";
char str[] = "qwery";
int ret = strncmp(arr, str, 5);//比较字符串前n个字符的大小
printf("%d", ret);
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
int my_strncpy(const char* s, const char* p, size_t n)
{
size_t i = 1;
assert(s && p && n);
while (*s == *p &&*s!='\0' && i<n)
{
s++;
p++;
i++;
}
return *s - *p;
}
int main()
{
char arr[] = "zyqr";
char str[] = "zaz";
int ret = my_strncpy(arr, str, 2);
if (ret == 0)
printf("=\n");
else if (ret < 0)
printf("<\n");
else
printf(">\n ");
return 0;
}
strstr-判断是否是子串
函数功能:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。
返回值:如果是子串,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL
函数原型: char * strstr ( const char * str1, const char * str2 );
返回值:strstr返回一个指针,指向string2在string1中首次出现的位置。
#include<stdio.h>
int main()
{
char* s = "qwerty";
char* p = "we";
char* ret = strstr(s, p);
if (ret == NULL)
printf("没找到\n");
else
printf("%s", ret);//werty
return 0;
}
模拟实现:
int strStr(char * haystack, char * needle){
int n=strlen(haystack),m=strlen(needle);
if(m==0)
return 0;
if(n<m)
return -1;
int i=0,j=0,k=0;
while(i<n){
if(haystack[i]==needle[j]){
k=i;
while(j<m&&haystack[i]==needle[j]){
j++;
i++;
if(j==strlen(needle))
return k;
}
}
else{
j=0;
i=k+1;
k++;
}
}
return -1;
}
strtok函数-分解字符串
函数原型:char *strtok(char s[], const char *delim)
函数功能:分解字符串为一组字符串
作用于字符串s,以包含在delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。
返回值:char*
- strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。
- strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
- strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。
- 如果字符串中不存在更多的标记,则返回 NULL 指针。
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "I. am@ a good, student";
char* pch;
pch = strtok(str, " ,.@");
//第一个参数不是NULL,返回了I的地址,将.改为了\0,同时保留了\0地址
while (pch != NULL)//如果说查找完,返回结果是NULL
{
printf("%s\n", pch);
pch = strtok(NULL, " ,.@");//参数为NULL,从保留地址开始查找
}
return 0;
}
strerror&perror-返回错误信息
strerror
函数功能:从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。strerror 生成的错误字符串取决于开发平台和编译器。
函数原型:char *strerror(int errnum)
- errnum -- 错误号,通常是 errno。
- errno头文件:errno.h
- 在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。
返回值:返回一个指向错误消息字符串的指针
返回值类型:char*
头文件:string.h
perror
头文件:stdio.h
函数原型:void perror(const char*str)
作用:直接输出输入信息和对应错误
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
FILE* fp = fopen("text.x", "r");
if (fp == NULL)
//程序出现错误时,errno会自动存储对应的错误码,strerror返回这个错误码指向的错误信息字符串
{
printf("%s\n", strerror(errno));
perror("错误");
}
else
printf("ok");
return 0;
}
输出结果:No such file or directory
错误: No such file or directory