一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项

这篇具有很好参考价值的文章主要介绍了一篇博客学会系列(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、错误信息报告函数

4.1、strerror

4.2、perror

5、字符函数

5.1、字符分类函数

5.2、字符转换函数

5.2.1、tolower

5.2.2、toupper

6、内存操作函数

6.1、memcpy

6.2、memmove

6.3、memset

6.4、memcmp

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

1、求字符串长度函数

1.1、strlen

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  • strlen用于求字符串长度。
  • 包含头文件<string.h>。
  • 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
  • 参数指向的字符串必须要以 '\0' 结束

注意:

1、函数的返回值为size_t,是无符号( 易错 )

2、因为strlen返回的是 '\0' 前面的字符个数,如果字符串中间本身就一个'\0',那么返回的值就会返回字符串中的'\0'之前的字符个数。

例如:"abc\0def" 这个字符串,使用strlen函数会返回3。

【使用方式】 

int main()
{
	char arr[] = "Hello hacynn";
	int ret = strlen(arr);
	printf("%d\n", ret);
	return 0;
}

【运行结果】

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

【易错提醒】

请问ret的值是多少?
int ret = strlen("abc") - strlen("abcdef");

答案是3,因为函数的返回值为size_t,是无符号的整型。

【模拟实现strlen】

int my_strlen(char* arr)
{
	int count = 0;
	while (*arr != '\0')
	{
		count++;
		arr++;
	}
	return count;
}

int main()
{
	char arr[] = "Hello hacynn";
	int ret = my_strlen(arr);
	printf("%d\n", ret);
	return 0;
}

2、字符串拷贝(cpy)、拼接(cat)、比较(cmp)函数

2.1、长度不受限制的字符串函数

2.1.1、strcpy

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  • strcpy用于拷贝字符串,将字符串2拷贝到字符串1当中。
  • 包含头文件<string.h>。
  • 源字符串必须以 '\0' 结束。
  • 会将源字符串中的 '\0' 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。

【使用方法】 

int main()
{
	char arr1[] = "Hello hacynn";
	char arr2[20] = { 0 };
	strcpy(arr2,arr1);
	printf("%s\n", arr2);
	return 0;
}

【运行结果】 

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

【模拟实现strcpy】

char* my_strcpy(char* dest,const char* src)
{
	char* ret = dest;
	while (*dest = *src)
	{
		dest++;
		src++;
	}
	return ret;
}

int main()
{
	char arr1[] = "Hello hacynn";
	char arr2[20] = { 0 };
	my_strcpy(arr2,arr1);
	printf("%s\n", arr2);
	return 0;
}

2.1.2、strcat

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  •  strcat用于拼接两个字符串,将字符串2拼接到字符串1末尾。
  • 包含头文件<string.h>。
  • 源字符串必须以 '\0' 结束(保证找得到目标空间的末尾),在拷贝时会把源字符串的 '\0 '也拷贝过去。
  • 目标空间必须有足够的大,能容纳下源字符串的内容,并且还可以被修改。

注意:

        不能字符串自己追加自己,因为当自己追加自己的时候,追加的过程中会将目标字符串的 '\0' 覆盖掉,而有因为此时目标字符串就是源字符串,就会导致源字符没有 '\0' ,将会一直拼接下去导致死循环。

        虽然有些环境中该函数可以完成自己拼接自己,但是C语言的标准中并未规定strcat可以自己拼接自己,所以这个函数最好不要使用在自己拼接自己的情况下。如果真有自己追加自己的场景,建议使用strncat函数,这个函数将在下文进行讲解。

【使用方式】

int main()
{
	char arr1[20] = "Hello ";
	char arr2[] = "hacynn" ;
	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

 【运行结果】

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

【模拟实现strcat】

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
    //找到目标空间的末尾
	while (*dest != '\0')
	{
		dest++;
	}
    //数据追加
	while (*dest = *src)
	{
		dest++;
		src++;
	}
	return ret;
}

int main()
{
	char arr1[20] = "Hello ";
	char arr2[] = "hacynn" ;
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

2.1.3、strcmp

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  • strcmp用于比较两个字符串。
  • 包含头文件<string.h>。
  • 误区:该函数不是比较字符串长度的,而是比较对应位置上字符的大小(ASCII)。
  • 标准规定:
    第一个字符串大于第二个字符串,则返回大于0的数字
    第一个字符串等于第二个字符串,则返回0
    第一个字符串小于第二个字符串,则返回小于0的数字

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

【使用方式】

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abz";
	if (strcmp(arr1, arr2) > 0)
		printf(">\n");
	else if (strcmp(arr1,arr2) < 0)
		printf("<\n");	
    else
        printf("=\n");
	return 0;
}

【运行结果】 

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

【模拟实现strcmp】

int my_strcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;
}

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abz";
	if (my_strcmp(arr1, arr2) > 0)
		printf(">\n");
	else
		printf("<=\n");	
	return 0;
}

2.2、长度受限制的字符串函数

  • 就是可以限制操作个数的字符串函数。
  • 包含头文件<string.h>。

2.2.1、strncpy

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  • 区别仅与strcpy差一个参数,记录要操作的个数。 
  • 拷贝num个字符从源字符串到目标空间。
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
  • 因为拷贝个数由用户自己决定,因此\0没有被拷贝过来的可能性也是有的。

【使用方式】 

int main()
{
	char arr1[] = "Hello hacynn";
	char arr2[20] = { 0 };
	strncpy(arr2, arr1, 5); //拷贝前五个字符 ,此时拷贝\0后arr2中并不会有\0
	printf("%s\n", arr2);
	return 0;
}

【运行结果】

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

【特殊情况】

如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。如下:

int main()
{
	char arr1[] = "Hello";
	char arr2[20] = "xxxxxxxxxxxxxxxxx";
	strncpy(arr2, arr1, 10);   //此时10大于arr1的元素个数,就会在后添加0直至够10个
	printf("%s\n", arr2);
	return 0;
}

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

2.2.2、strncat

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  • 区别也仅与strcat差一个参数,记录要操作的个数。
  • 使用strncat追加,当结束追加时,就算没到\0,也会在末尾追加一个\0。
  • 如果源字符串的长度小于num,则追加完源字符串之后,会自动停止追加。注意此处与strncpy的区别。
  • 包含头文件<string.h>。

【使用方式】

int main()
{
	char arr1[20] = "Hello ";
	char arr2[] = "hacynn" ;
	strncat(arr1, arr2, 3);
	printf("%s\n", arr1);
	return 0;
}

【运行结果】 

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

2.2.3、strncmp

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  • 区别也仅与strcmp差一个参数,记录要操作的个数。
  • 包含头文件<string.h>。

【使用方式】

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcz";
	if (strncmp(arr1, arr2, 3) > 0)   //只比较前三个字符
		printf(">\n");
	else if (strncmp(arr1, arr2, 3) == 0)
		printf("=\n");
	else
		printf("<\n");
	return 0;
}

【运行结果】

 一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

3、字符串查找函数

3.1、strstr

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  • 查找一个字符串中是否存在与另一个字符串当中,即找子串
  • 返回一个指向str1中第一个出现str2的指针,如果str2不是str1的一部分,则返回一个空指针NULL。
  • 包含头文件<string.h>。

【使用方式】

可以看到,即使是有两个字串 ,也只会返回第一次出现的地址。

int main()
{
	char arr1[] = "abcdefghidef";   //def出现了两次
	char arr2[] = "def";
	char* ret = strstr(arr1, arr2);
	if (ret == NULL)
		printf("找不到\n");
	else
		printf("%s\n", ret);
	return 0;
}

【运行结果】 

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

【模拟实现strstr】

const char* my_strstr(const char* str1, const char* str2)
{
    if (*str2 == '\0')
		return str1;
	char* pc = str1;  //pc用于记录开始匹配的位置
	while (*pc)
	{
		char* s1 = pc;   //遍历str1指向的字符串
		char* s2 = str2; //遍历str2指向的字符串
		while (*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return pc;
		pc++;
	}
	return NULL;
}

int main()
{
	char arr1[] = "abcdefghidef";
	char arr2[] = "def";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
		printf("找不到\n");
	else
		printf("%s\n", ret);
	return 0;
}

【图解】 

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

3.2、strtok

 一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

比较奇葩的一个函数
char * strtok ( char * str, const char * delimiters );
  • 切割字符串函数,例如hacynn@nash.com,当切割标记是@和 . 时,通过三次合理的使用可以切割出三个字符串:hacynn  nash  com
  • 包含头文件<string.h>。
  • delimiters参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由delimiters字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针

【使用方式】

int main()
{
	char arr[] = "hacynn@nash.com";
	char buf[200] = { 0 }; //因为strtok会改变被操作字符串,
	                        //所以拷贝一个临时变量来操作
	strcpy(buf, arr);
	char* p = "@.";
	char* s = strtok(buf, p); //参数不为NULL,找到第一个标记
	printf("%s\n", s);

	s = strtok(NULL, p); //参数为NULL,找到下一个标记
	printf("%s\n", s);

	s = strtok(NULL, p); 参数为NULL,找到下一个标记
	printf("%s\n", s);

	return 0;

【运行结果】

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

【使用方式优化 】

在实际开发中,我们不一定知道这个字符串是怎样的,这个字符串需要切割几次的,因此手动设置切割几次将代码写死的方式是不可取,而应该使用以下的方式进行自动切割。

int main()
{
	char arr[] = "hacynn@nash.com.hahaha@abcd";
	char buf[200] = { 0 };
	strcpy(buf, arr);
	char* p = "@.";

	char* s = NULL;
	for (s = strtok(buf, p); s != NULL; s = strtok(NULL, p))
	{
		printf("%s\n", s);
	}
	

	return 0;
}

这里巧妙的运用了for函数的初始化部分只执行一次的特点,而strtok也只需要第一次传地址,其他时候都只需要传NULL就行。

【优化后的运行结果】 

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

4、错误信息报告函数

4.1、strerror

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  • strerror函数是将错误码翻译成错误信息,返回错误信息的字符串起始地址。
  • 包含头文件<string.h>。
  • C语言中使用库函数的时候,如果发生错误,就会将错误码放在errno的变量中,errno是一个 全局变量,可以直接使用。

 【错误码举例】

int main()
{
	int i = 0;
	for ( i = 0; i < 10; i++)
	{
		printf("%d: %s\n", i, strerror(i));
	}
	return 0;
}

每一个错误码都对应一个错误信息 

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

【使用方式】

以打开文件为例子,fopen以读的形式打开文件,当文件存在时打开成功,文件不存在时打开失败,并返回空指针。可以利用这个来设置一个打开失败时的错误信息告知。

int main()
{
	FILE* pf = fopen("add.txt", "r");  //当前文件路径中并没有add.txt文件,打开失败
	if (pf == NULL)
	{
		printf("打开文件失败,原因是:%s\n", strerror(errno));
		return 1;
	}
	else
	{
		printf("打开文件成功\n");
	}
	return 0;
}

【运行结果】

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

4.2、perror

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  • perror也是用于翻译错误信息 ,但与strerror不同的是,perror会直接打印错误码所对应的错误信息。而perror中传递的字符串参数就是自定义显示信息的部分,打印的结果就是 自定义显示信息:错误信息
  • 包含头文件<stdlib.h>
  • 可以简单理解为:perror = printf + strerror 即翻译又打印

【使用方式】

int main()
{
	FILE* pf = fopen("add.txt", "r");
	if (pf == NULL)
	{
		perror("打开文件失败");   //注意:此处是perror,不是printf。
		return 1;
	}
	else
	{
		printf("打开文件成功\n");
	}
	return 0;
}

【运行结果】 

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

5、字符函数

5.1、字符分类函数

字符分类函数使用非常简单,由于篇幅受限,在这里不就一一列举了 ,只需要把下面的图看懂就行。

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

5.2、字符转换函数

5.2.1、tolower

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

这个函数听名字就知道是用于将大写字母转换成小写字母,而这类函数唯一需要注意的就是函数有返回值,返回类型为int,因此在使用的时候最好使用一个int ret接收返回值。

int main()
{
	int ret = tolower('A');
	printf("%c\n", ret);
}

5.2.2、toupper

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

小写字母转大写字母,其他注意点与tolower一致。

6、内存操作函数

上文讲到的字符串函数只适用于字符串,但是内存中的数据不仅仅只有字符,这就导致这些函数有很大的局限性。因此需要有一个能够对所有类型的数据都适用的函数,这就是内存操作函数的出现的原因。下面我们来学习一下内存操作函数。

6.1、memcpy

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  • 函数memcpy从source的位置开始向后拷贝num个字节的数据到destination的内存位置。
  • 包含头文件<string.h>
  • 这个函数在遇到 '\0' 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。
  • 因为C语言标准中并未规定memcpy能适用于重叠内存的拷贝,因此不重叠内存的拷贝才使用memcpy,而重叠内存的拷贝使用接下来讲解的memmove函数。

【使用方式】 

使用memcpy拷贝整型数据。

int main()
{
	int arr1[10] = { 0 };
	int arr2[] = { 1,2,3,4,5 };
	memcpy(arr1, arr2, sizeof(int) * 5);
	int i = 0;
	for ( i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

【运行结果】 

 一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

【模拟实现memcpy】

void* my_memcpy(void* dest, const void* src, size_t sz)
{
	void* ret = dest;
	while (sz)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
		sz--;
	}
	return ret;
}

int main()
{
	int arr1[10] = { 0 };
	int arr2[] = { 1,2,3,4,5 };
	my_memcpy(arr1, arr2, sizeof(int) * 5);
	int i = 0;
	for ( i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

6.2、memmove

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  •  memmove的参数和功能与memcpy完全一致。
  • 包含头文件<string.h>
  • 唯一有区别的就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 因此当出现重叠内存的拷贝时,就使用memmove函数处理。

 【模拟实现memmove】

void* my_memmove(void* dest, const void* src, size_t sz)
{
	void* ret = dest;
	if (dest < src)
	{
		while (sz)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
			sz--;
		}
	}
	else
	{
		while (sz--)
		{
			*((char*)dest + sz) = *((char*)dest + sz);
		}
	}
	return ret;
}

int main()
{
	int arr1[] = { 1,2,3,4,5 ,6,7,8,9,10 };
	my_memmove(arr1, arr1+2, sizeof(int) * 5);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

6.3、memset

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  • 将ptr所指向空间的前num个字节设置为指定值value。
  • 包含头文件<string.h>

【使用方式】 

int main()
{
	char arr[] = "hello world";
	memset(arr + 6, 'x', 3);
	printf("%s\n", arr);
	return 0;
}

 【运行结果】

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

6.4、memcmp

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio

  • 比较ptr1和ptr2前num个字节的内容。
  • 包含头文件<string.h>
  • 标准规定:
    ptr1大于ptr2,则返回大于0的数字。
    ptr1等于ptr2,则返回0。
    ptr1小于ptr2,则返回小于0的数字。

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio 【使用方式】

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[] = { 1,2,3,7 };
	int ret = memcmp(arr1, arr2, sizeof(int) * 3);
	printf("%d\n", ret);
}

【运行结果】 

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项,一篇博客学会系列,c语言,开发语言,c++,算法,visualstudio


如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!文章来源地址https://www.toymoban.com/news/detail-717776.html

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

到了这里,关于一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 一篇博客学会系列(2)—— C语言中的自定义类型 :结构体、位段、枚举、联合体

    目录  前言 1、结构体 1.1、结构体类型的声明 1.2、特殊的结构体类型声明 1.3、结构体的自引用 1.4、结构体的定义和初始化 1.5、结构体成员变量的调用 1.6、结构体内存对齐  1.6.1、offsetof 1.6.2、结构体大小的计算 1.6.3、为什么存在内存对齐?  1.7、 修改默认对齐数 1.8、结构

    2024年02月08日
    浏览(30)
  • C语言学习系列-->字符函数和字符串函数

    包含头文件: 函数 如果它的参数复合下列条件就返回真(一个非零数字) iscntrl 任何控制字符 任何控制字符 空白字符:空格’ ‘,换页’f’,换行’n’,回车’r’,制表符’t’或者垂直制表符’v’ isdigit 十进制数字0~9 isxdigit 十六进制数字,包括所有十进制数字,小

    2024年02月09日
    浏览(29)
  • R语言【cli】——ansi_strip():抹除字符串中所有的ANSI标记

    Package  cli  version 3.6.0 输入可以是cli_ansi_string类,这也从结果中删除。 参数【string】 :输入字符串。 参数【sgr】 :是否移除SGR(样式化)控制序列。 参数【csi】 :非sgr控制序列是否移除。 参数【link】 :是否移除ANSI超链接。 清理干净后的字符串。注意,ansi_strip()总是放弃

    2024年01月21日
    浏览(26)
  • JavaScript从入门到精通系列第三十一篇:详解JavaScript中的字符串和正则表达式相关的方法

      文章目录 知识回顾 1:概念回顾 2:正则表达式字面量 一:字符串中正则表达式方法 1:split 2:search 3:match 4:replace         正则表达式用于定义一些字符串的规则,计算机可以根据正则表达式检查一个字符串是否符合规则,或者将字符串中符合规则的内容提取出来。

    2024年01月17日
    浏览(45)
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】

    欢迎来CILMY23的博客喔,本期系列为​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】,图文讲解各种字符串函数,带大家更深刻理解C语言中各种字符串函数的应用,感谢观看,支持的可以给个赞哇。  前言 上一篇说到,有不受长度限

    2024年02月22日
    浏览(37)
  • 【学会动态规划】环绕字符串中唯一的子字符串(25)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:467. 环绕字符串中唯一的子字

    2024年02月10日
    浏览(27)
  • 【华为OD机考 统一考试机试C卷】求字符串中所有整数的最小和(C++ Java JavaScript Python C语言)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年04月09日
    浏览(62)
  • js如何截取某个字符串前面所有的字符串

    利用substring()方法截取出字符 1.新建一个字符串 2.通过indexOf()方法获取你想截止到的那个字符 3.通过substring()方法,从字符串0位置开始截取至\\\"p\\\"前面的字符串

    2024年02月12日
    浏览(34)
  • 【Golang】Golang进阶系列教程--为什么说 Go 语言字符串是不可变的?

    最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢? 这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。 首先来看看它的底层结构: 和切片的结构很像,只不过少了一个

    2024年02月14日
    浏览(42)
  • 【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数

    gets函数类似于scanf函数,用于读取标准输入.前面我们已经知道scanf函数在读取字符串时遇到空格就认为读取结束,所以当输入的字符串存在空格时,我们需要使用gets 函数进行读取. gets函数的格式如下: gets函数从STDIN (标准输入)读取字符并把它们加载到str(字符串)中,直到遇

    2024年01月22日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包