c语言入门-字符函数

目录

strlen函数-求字符串长度

strcpy函数-字符串复制函数

strcat-字符串连接函数

 strcmp函数-比较函数

strncpy-字符复制函数

strncat函数-字符连接函数

strncmp-字符串比较函数

strstr-判断是否是子串

 strtok函数-分解字符串

 strerror&perror-返回错误信息


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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值