进阶C语言——字符串和内存函数

这篇具有很好参考价值的文章主要介绍了进阶C语言——字符串和内存函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天我们学点库函数

字符函数和字符串函数

求字符串长度函数->strlen

进阶C语言——字符串和内存函数,c语言,算法

进阶C语言——字符串和内存函数,c语言,算法
进阶C语言——字符串和内存函数,c语言,算法
strlen需要的头文件是string.h ,那它的作用是什么呢??
他是来求字符串长度的,统计的是’\0’前的字符串长度

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdef";
	size_t len = strlen(arr1);
	printf("%d", len);
	return 0;
}

size_t是无符号的意思

学会了strlen函数怎么使用,那我们现在模拟实现一下strlen

之前讲过三种方式来实现,大家是否还记得呢?分别是计数的方式,函数递归的方式,还有我们的指针

计数器的方式

#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr)
{
	assert(*arr);
	int count = 0;
	while (*arr++)
	{
		count++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	size_t len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

函数递归

#include<stdio.h>

size_t my_strlen(const char* arr)
{
	
	if (*arr != 0)
	{
		return 1 + my_strlen(arr + 1);
	}
	
}
int main()
{
	char arr[] = "abcdef";
	size_t len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

指针运算

#include<stdio.h>
int my_strlen(char* arr)
{
	char* str = arr;
	while (*arr)
	{
		arr++;
	}
	return arr - str;
}
int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

strcpy函数
进阶C语言——字符串和内存函数,c语言,算法
strcpy的作用是把我们的后面字符拷贝到前面字符,但是我们也有相应的前提

源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。

那我们用代码来看看效果吧

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "xxx";
	printf("%s", strcpy(arr1, arr2));
	return 0;
}

进阶C语言——字符串和内存函数,c语言,算法
我们可以看到其实我们在拷贝的时候,把’\0‘也拷贝进去,下面再给大家看一个特殊例子
进阶C语言——字符串和内存函数,c语言,算法
观察到我们拷贝的时候,是\0之前,这也符合我们上面的规定
现在我们写一个函数来模拟实现这个效果吧

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
	assert(*dest && *src);
	char* ret = dest;
		while (*dest++ = *src++)
		{
			;
		}
		return dest;
}
int main()
{
	char arr1[] = "xxxxx";
	char arr2[] = "abcd";
	char* arr3 = my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

我们只是模拟实现,不可能实现vs中的strcpy的功能,比如上面我们的代码缺陷就是不能自己copy自己,会存在覆盖现象,导致不能达到我们想要的效果
stract
进阶C语言——字符串和内存函数,c语言,算法
源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。

这是一个追加的字符串,比如我们要想在arr1字符串后面追加一个hello,这样就可以用我们的strcat

我们用代码看一下它该怎么使用

#include<stdio.h>
#include<string.h>
int main()
{

	char arr1[] = "hello";
	char arr2[] = " CSDN";
	char* ret = strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

那我们接下来就是模拟实现函数

#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* str)
{
	assert(*dest && *str);
	char* ret = dest;
	while (*++dest)
	{
		;
	}
	while (*dest++ = *str++ )
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "hello";
	char arr2[] = " CSDN";
	char* ret = my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

strcmp
这是一个比较字符串的函数,但是大家可不要误以为是比较长度的,它的作用是比较ASCII的,一个字符一个字符进行比较
进阶C语言——字符串和内存函数,c语言,算法
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
所以我们的strcmp函数的返回值应该是整型
下面我们就写个代码看看效果吧

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcde";
	char arr2[] = "abcdq";
	int len = strcmp(arr1, arr2);
	printf("%d", len);
	return 0;
}

那我们也来模拟实现一下strcmp

#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* dest, const char* str)
{
	assert(*dest && *str);
	while (*dest == *str && *dest && *str)
	{
		dest++;
		str++;
	}
	if (dest==NULL)
	{
		return 0;
	}
	return *dest - *str;

}
int main()
{
	char arr1[] = "abcde";
	char arr2[] = "abcdq";
	int len = my_strcmp(arr1, arr2);
	printf("%d", len);
	return 0;
}

strstr
进阶C语言——字符串和内存函数,c语言,算法

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "This is a simple string";
	char* pch;
	pch = strstr(str, "simple");
	if (pch == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了\n");
	}
	
	return 0;
}

模拟实现

#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* dest, const char* str)
{
	assert(dest && str);
	char* s1 = dest;
	char* s2 = str;
	char* cul = dest;
	while (*cul)
	{
		s1 = cul;
		s2 = str;
		while (*s1 == *s2)
		{
			s1++;
			s2++;
			if (*s2)
			{
				return cul;
			}
		}
		cul++;
	}
	return NULL;
}
int main()
{
	char str[] = "This is a simple string";
	char arr[] = "simple";
	char* p = my_strstr(str, arr);
	if (p == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了\n");
	}
	return 0;
}

strstr最大作用就是找这个里面有没有我们想要的字符串,如果有就返回查找字符串内该字符串的地址,如果没有就返回空指针

strtok

char * strtok ( char * str, const char * sep );

sep参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回 NULL 指针。

代码演示

#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;
}
#include <stdio.h>
int main()
{
   char *p = "tangjiale@lj.sy";
 const char* sep = ".@";
 char arr[30];
 char *str = NULL;
 strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
 for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep))
 {
 printf("%s\n", str);
 }
}

主要解释第二个代码,因为我们的(str=strtok(arr, sep)只循环一次,这样就可以用for语句来实现,然后strtok是从该内容的后面开始查找,而我们遇到分隔符,其实就相当于变成’\0’,就是空指针,这样我们就写成一个循环,代码优化

strerror

char * strerror ( int errnum );

#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main()
{
	FILE* pFile;
	pFile = fopen("unexist.ent", "r");
	if (pFile == NULL)
		printf("Error opening file unexist.ent: %s\n", strerror(errno));
	//errno: Last error number
	return 0;
}

进阶C语言——字符串和内存函数,c语言,算法
我们的errno就是错误信息,要包含头文件,其实strerror和perror差不多,都是为了找出错误信息,我们也看看perror

进阶C语言——字符串和内存函数,c语言,算法

函数 如果他的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace 空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit 十进制数字 0~9
isxdigit 十六进制数字,包括所有十进制数字,小写字母af,大写字母AF
islower 小写字母a~z
isupper 大写字母A~Z
isalpha 字母az或AZ
isalnum 字母或者数字,az,AZ,0~9
ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph 任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符

以上是一些字符函数的,大家下去一定要试试,这里小编就不一一举例子了

就介绍几个吧

isdigit 十进制数字 0~9
就比如这个,这个的作用就是我们再isdigit只能输入数字,这和while(x>‘0’ && x<‘9’)的效果一样

还有这个

int tolower ( int c );
int toupper (int c)

字符转换

#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
 {
    c=str[i];
    if (isupper(c)) 
        c=tolower(c);
    putchar (c);
    i++;
 }
  return 0;
}

进阶C语言——字符串和内存函数,c语言,算法
转为小写

memcpy
进阶C语言——字符串和内存函数,c语言,算法
模拟实现

void * memcpy ( void * dst, const void * src, size_t count)
{
        void * ret = dst;
 assert(dst);
   assert(src);
        /*
         * copy from lower addresses to higher addresses
         */
        while (count--) {
                *(char *)dst = *(char *)src;
                dst = (char *)dst + 1;
                src = (char *)src + 1;
       }
        return(ret);
}

memmove
进阶C语言——字符串和内存函数,c语言,算法
模拟实现

#include<stdio.h>
void* memmove(void* dst, const void* src, size_t count)
{
	void* ret = dst;
	if (dst <= src || (char*)dst >= ((char*)src + count)) {
	
		while (count--) {
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
	else {
		
		dst = (char*)dst + count - 1;
		src = (char*)src + count - 1;
		while (count--) {
			*(char*)dst = *(char*)src;
			dst = (char*)dst - 1;
			src = (char*)src - 1;
		}
	}
	return(ret);
}

strncpy
这个其实和strcpy差不多就是加了一个我们拷贝多少字节的内容,我就不过多讲解了

进阶C语言——字符串和内存函数,c语言,算法

拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
strncat
进阶C语言——字符串和内存函数,c语言,算法

它可以给自己追加

/* strncat example */
#include <stdio.h>
#include <string.h>
int main ()
{
 char str1[20];
 char str2[20];
 strcpy (str1,"To be ");
 strcpy (str2,"or not to be");
 strncat (str1, str2, 6);
 puts (str1);
 return 0;
}

strncmp

int strncmp ( const char * str1, const char * str2, size_t num );

进阶C语言——字符串和内存函数,c语言,算法

#include <stdio.h>
#include <string.h>
int main ()
{
  char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
  int n;
  puts ("Looking for R2 astromech droids...");
  for (n=0 ; n<3 ; n++)
  if (strncmp (str[n],"R2xx",2) == 0)
 {
    printf ("found %s\n",str[n]);
 }
  return 0;
}

他的返回值是一个整型

今天的内容就讲完了。我们下次再见,谢谢大家文章来源地址https://www.toymoban.com/news/detail-577540.html

到了这里,关于进阶C语言——字符串和内存函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【进阶C语言】字符函数和字符串函数(万文详解)

    前言 C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。 字符串常量适用于那些对它不做修改的字符串函数. 今天将带来C语言函数的使用介绍 分为三部分供大家理解 如果这份博客对大家有帮助,希望

    2024年01月18日
    浏览(64)
  • c语言——字符串函数和内存操作函数

    包含在string.h头文件里 功能:返回字符串中有效字符的个数,遇到‘\\0’结束,不包括结束符‘\\0’. 函数的参数为------const char* str:字符指针 返回值的类型------size_t:无符号整数(即:unsigned int) 模拟实现strlen: 方法一:计数器的方法 方法二:不能创建临时变量的计数器

    2024年02月14日
    浏览(68)
  • 【C语言进阶(三)】字符串操作函数

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 C语言的标准库为我们提供了丰富的字符串操作函数与内存操作函数,有我们熟悉的 strlen ,strcpy ,也有我们不熟悉的 strchr , strstr 等

    2024年02月09日
    浏览(63)
  • 【C语言】字符函数与字符串函数以及内存函数 { 超详细攻略,一篇学会 }

    今日分享:字符、字符串函数和内存函数 内存函数 就是对内存进行操作的函数 字符串函数 就是对字符串进行操作的函数 字符函数 就是对字符进行操作的函数 str 前缀的函数是字符串函数,头文件string.h mem 前缀的函数是内存函数,头文件stdlib.h 字符分类函数包含在 ctype.h 头

    2024年03月18日
    浏览(58)
  • C语言之字符串,内存操作函数详解(一)

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 C语言的标准库为我们提供了丰富的字符串操作函数与内存操作函数,有我们熟悉的 strlen ,strcpy ,也有我们不熟悉的 strchr , strstr 等

    2024年02月08日
    浏览(66)
  • 【c语言:常用字符串函数与内存函数的使用与实现】

    简介:本篇文章是对C语言中常用的字符串函数和内存函数的学习以及模拟实现 文档内容来自:https://legacy.cplusplus.com/ 字符串以 ‘\\0’ 作为结束标志, strlen函数返回的是在字符串中 ‘\\0’ 前⾯出现的字符个数( 不包含 \\\'\\0\\\' )。 参数指向的字符串必须要以 ‘\\0’ 结束。 注意函

    2024年02月04日
    浏览(43)
  • c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))

    上篇文章介绍了一些常用的字符串函数,大家可以跳转过去浏览一下:c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))_总之就是非常唔姆的博客-CSDN博客 今天接着来介绍一些:  目录 一.字符串查找 1.strstr() 1.1示例 1.2注意事项: 1.3模拟实现  2.

    2024年02月07日
    浏览(44)
  • 一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项

    目录 1、求字符串长度函数 1.1、strlen 2、字符串拷贝(cpy)、拼接(cat)、比较(cmp)函数 2.1、长度不受限制的字符串函数 2.1.1、strcpy 2.1.2、strcat 2.1.3、strcmp 2.2、长度受限制的字符串函数 2.2.1、strncpy 2.2.2、strncat 2.2.3、strncmp 3、字符串查找函数 3.1、strstr 3.2、strtok 4、错误信息报告函数

    2024年02月08日
    浏览(48)
  • 字符串函数+内存函数(详解)

    本期带大家一起来学习字符串函数+内存函数😀 😃 😄 1. 求字符串长度 strlen🚀🚀 字符串 已经 ‘\\0’ 作为结束标志 ,strlen函数返回的是在字符串中 ‘\\0’ 前面出现的字符个数(不包含 ‘\\0’ )。 strlen在库里面的参数是如此的 ⌛️⌛️ 接下来我们来模拟实现strlen ,接下来

    2023年04月17日
    浏览(41)
  • 字符串函数和内存操作函数

    目录 0.字符串回顾 1.函数介绍 1.1 strlen 1.2 strcpy 1.3 strcat 1.4 strcmp 1.5 strncpy 1.6 strncat 1.7 strncmp 1.8 strstr 1.9 strtok 1.10 strerror 1.11 memcpy 1.12 memmove 1.13 memcmp 1.14 memset 1.15 字符相关函数 字符分类函数 字符转换函数 2.函数模拟实现 2.1模拟实现strlen 2.2模拟实现strcpy 2.3模拟实现strcat 2.4模拟

    2024年02月15日
    浏览(107)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包