字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数

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

目录

 1、strlen函数

strlen函数的模拟实现

2、strcpy函数

strcpy函数的模拟实现 

strncpy函数

 strncpy函数的模拟实现

3、srtcat函数

strcat函数的模拟实现 

strncat函数

strncat函数的模拟实现

4、strcmp函数

strcmp函数的模拟实现

strncmp函数

5、strstr函数

strstr函数的模拟实现

6、strtok函数

7、strerror函数

 8、perror函数


 1、strlen函数

描述:

C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。

 函数声明:

size_t strlen(const char *str)

 返回值:

该函数返回字符串的长度。

 用法:
 

#include <stdio.h>
#include <string.h>

int main ()
{
   char str[50];
   int len;

   strcpy(str, "This is runoob.com");

   len = strlen(str);
   printf("|%s| 的长度是 |%d|\n", str, len);
   
   return(0);
}

结果:

字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数,C语言,算法,c语言

strlen函数的模拟实现

#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str)
{
	int count = 0;
	assert(str);
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[] = { "hello world!" };
	int red = my_strlen(arr);
	printf("%d\n", red);
	return 0;
}

2、strcpy函数

描述:

C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest

需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。

函数声明:

char *strcpy(char *dest, const char *src)

  参数:

  • dest -- 指向用于存储复制内容的目标数组。
  • src -- 要复制的字符串。

返回值:

该函数返回一个指向最终的目标字符串 dest 的指针。

 用法:文章来源地址https://www.toymoban.com/news/detail-847250.html

#include <stdio.h>
#include <string.h>
 
int main ()
{
  char str1[]="Sample string";
  char str2[40];
  char str3[40];
  strcpy (str2,str1);
  strcpy (str3,"copy successful");
  printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
  return 0;
}

 结果:

字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数,C语言,算法,c语言

strcpy函数的模拟实现 

#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* dest, const char* str)
{
	char* ret = dest;//把dest的地址给ret
	assert(dest != NULL);
	assert(str != NULL);
	while (*dest++ = *str++)//将str上的值赋给dest
	{
		;
	}
	return ret;//ret是一个插入类型的指针,里面存储着dest的地址
}

int main()
{
	char arr1[] = { "hello world!" };
	char arr2[100] = { 0 };
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

strncpy函数

与strcpy相似,只是多了一个限制复制字符个数的条件

声明:

char *strncpy(char *dest, const char *src, size_t n)

 n -- 要从源中复制的字符数。

用法:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = { "hello world" };
	char arr2[20] = { 0 };
	int n = 5;
	strncpy(arr2, arr1, n);
	printf("%s\n", arr2);
	return 0;
}

 strncpy函数的模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strncpy(char* dest, char* str, size_t n)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(str != NULL);
	int i = 0;
	for (i = 0; i < n; i++)
	{
		*dest++ = *str++;
	}
	return ret;
}

int main()
{
	char arr1[20] = "hello world";
	char arr2[20] = { 0 };
	
	int num = 7;
	my_strncpy(arr2, arr1, num);
	printf("%s\n", arr2);
	return 0;
}

 结果:

字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数,C语言,算法,c语言

3、srtcat函数

描述:

C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。

 函数声明:

char *strcat(char *dest, const char *src)

 参数:

  • dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
  • src -- 指向要追加的字符串,该字符串不会覆盖目标字符串。

返回值:

该函数返回一个指向最终的目标字符串 dest 的指针。 

用法:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = { 0 };
	char arr2[20] = { 0 };
	strcpy(arr1, "world hello");
	strcpy(arr2, "hello ");
	strcat(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

strcat函数的模拟实现 

#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest, const char* str)
{
	char* ret = dest;//把dest的地址给ret
	assert(dest != NULL);
	assert(str != NULL);

	while (*dest)
	{
		dest++;//遍历完dest
	}
	//在遍历完dest的基础上再给dest赋值
	while (*dest++ = *str++)
	{
		;
	}
	return ret;//ret是一个char类型的指针,里面存储着dest的地址
}

int main()
{
	char arr1[] = { "hello world!" };
	char arr2[100] = { "hello " };//目标空间一定要足够,不然会报错
	my_strcat(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

strncat函数

与strcat相似,只是多了一个限制追加字符个数的条件

函数声明:

char *strncat(char *dest, const char *src, size_t n)

n -- 要追加的最大字符数。

用法:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = { 0 };
	char arr2[20] = { 0 };
	strcpy(arr1, "world hello");
	strcpy(arr2, "hello ");
	int num = 5;
	strncat(arr2, arr1,num);
	printf("%s\n", arr2);
	return 0;
}

结果:

字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数,C语言,算法,c语言

strncat函数的模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strncat(char* dest, char* str, size_t n)
{
	assert(dest != NULL);
	assert(str != NULL);
	char* ret = dest;

	while (*dest)
	{
		dest++;
	}
	for (int i = 0; i < n; i++)
	{
		*dest++ = *str++;
	}
	return ret;
}

int main()
{
	char arr1[20] = { 0 };
	char arr2[20] = { 0 };
	strcpy(arr1, "world hello");
	strcpy(arr2, "hello ");
	int num = 5;
	my_strncat(arr2, arr1,num);
	printf("%s\n", arr2);
	return 0;
}

结果:

字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数,C语言,算法,c语言

4、strcmp函数

描述:

C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

 声明:

int strcmp(const char *str1, const char *str2)

参数:

  • str1 -- 要进行比较的第一个字符串。
  • str2 -- 要进行比较的第二个字符串。

返回值:

  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。

用法:
 

字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数,C语言,算法,c语言

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str1[15];
   char str2[15];
   int ret;
 
 
   strcpy(str1, "abcdef");
   strcpy(str2, "ABCDEF");
 
   ret = strcmp(str1, str2);
 
   if(ret < 0)
   {
      printf("str1 小于 str2");
   }
   else if(ret > 0) 
   {
      printf("str1 大于 str2");
   }
   else 
   {
      printf("str1 等于 str2");
   }
   
   return(0);
}

strcmp函数的模拟实现

#include <stdio.h>
#include <assert.h>
#include <string.h>
int my_strcmp( const char* s1,const char* s2)
{
	assert(s1 != NULL);
	assert(s2 != NULL);
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
			return 0;
		s1++;
		s2++;
	}
	return *s1 - *s2;
}
int main()
{
	char str1[15];
	char str2[15];
	strcpy(str1, "abcdef");
	strcpy(str2, "ABCDEF");
	int ret = my_strcmp(&str1, &str2);
	if (ret > 0)
	{
		printf("str1 > str2\n");
	}
	else if (ret < 0)
	{
		printf("str1 < str2\n");
	}
	else
	{
		printf("str1 = str2\n");
	}
	return 0;
}

strncmp函数

函数声明:

int strncmp(const char *str1, const char *str2, size_t n)

 用法:

#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[15];
   char str2[15];
   int ret;


   strcpy(str1, "abcdef");
   strcpy(str2, "ABCDEF");

   ret = strncmp(str1, str2, 4);

   if(ret < 0)
   {
      printf("str1 小于 str2");
   }
   else if(ret > 0) 
   {
      printf("str2 小于 str1");
   }
   else 
   {
      printf("str1 等于 str2");
   }
   
   return(0);
}

5、strstr函数

描述:

C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。

 声明:

char *strstr(const char *haystack, const char *needle)

 参数:

  • haystack -- 要被检索的 C 字符串。
  • needle -- 在 haystack 字符串内要搜索的小字符串。

 返回值:

该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。

 用法:

#include <stdio.h>
#include <string.h>
int main()
{
	const char haystack[20] = "notebook";
	const char needle[10] = "book";
	char* ret = strstr(haystack, needle);
	if (ret != NULL)
	{
		printf("%s\n", ret);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

strstr函数的模拟实现

这个函数的模拟实现就比较麻烦了。我们来仔细分析一下。

先来看函数的定义:

char* my_strstr(const char* haystack, const char* needle)

字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数,C语言,算法,c语言

haystack和needle分别指向字符串的首字母,如果找到相同的字符,haystack和needle向后移一位,如果没有找到相同的,haystack向后移一位。如果全部找到,就要返回 b 的地址。当haystack和needle分别向后找的时候,没人会记得b的地址,所以就要有一个指针记录开始匹配的位置。

但是还有一种情况:

字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数,C语言,算法,c语言

haystack找到n的时候和needle找到 t 的时候,两个不匹配,就要重匹配,needle就要重新回去,所以还要有一个指针记录needle的起始位置.同理也还要一个指针记录haystack的起始位置。

字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数,C语言,算法,c语言

#include <stdio.h>

char* my_strstr(const char* haystack, const char* needle)
{
	const char* str1 = NULL;//str1 用来记录haystack
	const char* str2 = NULL;//str2 用来记录needle
	const char* count = haystack;// count记录 查找的起始位置

	while (*count)
	{
		str1 = count; //将查找的起始位置给str1
		str2 = needle;//将被查找的起始位置给str2
		while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2)
		{   //*str1为\0,就说明后面没有可以查找的了
			//*str2为\0,就说明已经找完了
			str1++;
			str2++;
		}
		if (*str2 == '\0')
		{
			return (char*)count;//查找完了就返回查找的起始位置count
		}

		count++; //查找不匹配,查找起始位置就往后移一位
	}
	return NULL; //找不到返回空指针
}
int main()
{
	char arr1[20] = "nonotebook";
	char arr2[10] = "note";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
	{
		printf("%s\n", ret);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

6、strtok函数

描述:

C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。

声明:

char *strtok(char *str, const char *delim)

参数:

  • str -- 要被分解成一组小字符串的字符串。
  • delim -- 包含分隔符的 C 字符串。

返回值:

该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。

 用法:

#include <string.h>
#include <stdio.h>

int main() {
	char str[80] = "This is - www.runoob.com - website";
	const char s[2] = "-";
	char* token;

	/* 获取第一个子字符串 */
	token = strtok(str, s);
	
	/* 继续获取其他的子字符串 */
	while (token != NULL) {
		printf("%s\n", token);

		token = strtok(NULL, s);
	}

	return(0);
}

7、strerror函数

描述:

C 库函数 char *strerror(int errnum) 从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。strerror 生成的错误字符串取决于开发平台和编译器。

声明:

char *strerror(int errnum)

参数:

  • errnum -- 错误号,通常是 errno

 返回值:

该函数返回一个指向错误字符串的指针,该错误字符串描述了错误 errnum。

 strerror函数可以把参数部分错误码对应的信息的字符串地址返回来。

在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在error.h这个头文件中说明的,C语言程序启动的时候就会使用一个全面的变量 errno 来记录程序的当前错误码,只不过程序启动的时候 errno 是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在 errno 中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。 strerror 函数就可以将错误对应的错误信息字符串的地址返回。

在Windouws和VS2022环境下

#include <errno.h>
#include <string.h>
#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 0; i <= 10; i++) {
		printf("%s\n", strerror(i));
	}
	return 0;
}

结果:

字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数,C语言,算法,c语言

用法:

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main ()
{
   FILE *fp;

   fp = fopen("file.txt","r");
   if( fp == NULL ) 
   {
      printf("Error: %s\n", strerror(errno));
   }
   
  return(0);
}

结果:

字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数,C语言,算法,c语言

 8、perror函数

描述:

C 库函数 void perror(const char *str) 把一个描述性错误消息输出到标准错误 stderr。首先输出字符串 str,后跟一个冒号,然后是一个空格。

声明:

void perror(const char *str)

参数:

  • str -- 这是 C 字符串,包含了一个自定义消息,将显示在原本的错误消息之前。

注意,这里str是一个C字符串,就要用C字符串的格式来写

返回值:

该函数没有返回值。

 用法:

#include <stdio.h>

int main ()
{
   FILE *fp;

   /* 首先重命名文件 */
   rename("file.txt", "newfile.txt");

   /* 现在让我们尝试打开相同的文件 */
   fp = fopen("file.txt", "r");
   if( fp == NULL ) {
      perror("Error: ");
      return(-1);
   }
   fclose(fp);
      
   return(0);
}

到了这里,关于字符函数strlen、strcpy、strcat、strcmp、strstr、strtok、 strerror和perror函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • c语言-库函数strstr()、strtok()、strerror()介绍

    本篇文章介绍c语言库函数strstr()、strtok()、strerror()的使用。 strstr()实现的是查找子字符串。 下面是cplusplus网站关于这个库函数的介绍以及使用。 说明: 参数str1:被扫描的字符串 参数str2:需要查找的子字符串 返回值: 返回值不为NULL,说明在str1存在str2,返回str1第一次出现s

    2024年01月17日
    浏览(54)
  • C语言--strcmp函数,strcat函数,strcpy函数详解及实现

    目录 1.strcmp函数 1.1函数介绍 1.2函数使用 1.2.1代码 1.2.2运行结果 1.3模拟实现strcmp 1.3.1实现思路 1.3.2代码  1.3.3运行结果 2.strcat函数 2.1函数介绍 2.2函数使用  2.2.1代码 2.2.2运行结果 2.3模拟实现strcat 2.3.1实现思路 2.3.2代码  2.3.3运行结果 3.strcpy函数 3.1函数介绍 3.2函数使用 3.2.1代

    2024年02月01日
    浏览(65)
  • C语言——字符函数和字符串函数(三)【strtok,strerror,perror】

    📝前言: 上一篇文章C语言——字符函数和字符串函数(二)对字符函数和字符串函数 strstr , strcmp和strncmp 进行了一定的讲解 这篇文章主要讲解以下函数的用法: 1, strtok 2, strerror 3, perror 🎬个人简介:努力学习ing 📋个人专栏:C语言入门基础 🎀CSDN主页 愚润求学 🌄每

    2024年02月04日
    浏览(24)
  • C语言sscanf,strstr和strtok函数用于字符提取分割

    sscanf函数(提取字符): 从输入字符串的左边开始往右匹配,遇到不符合匹配规则时则结束匹配。注意是遇到不符合描述规则时就结束,而不是从整个字符串中提取出符合规则的部分。 字符串格式描述说明: 代码示例: \\\"%04d%02d%02d\\\"是用来解析字符串的格式,%表示格式转换的

    2024年01月16日
    浏览(31)
  • C语言中常用的字符串函数(strlen、sizeof、sscanf、sprintf、strcpy)

      strlen即为string length,顾名思义该函数是用来求字符串长度的。在介绍strlen函数之前,我们要先介绍一下\\\"\\0\\\"这个转义字符。任何一个字符串后面都会隐藏一个\\\"\\0\\\",该转义字符是字符串结束的标志,所以我们在使用strlen函数求字符串长度时,遇到\\\"\\0\\\"时停止读取,此时\\\"\\0\\\"前的

    2024年01月18日
    浏览(38)
  • C语言-----函数功能实现---strcpy&&strlen

    1 .函数功能参数介绍 该函数的功能就是把一个字符串复制到另外的一个数组,包括\\\'\\0\\\'; 2.首先我们要明确字符串的复制也是包括最后的\\0的; 跳出while循环之后就会把末尾的\\0实现复制; 3.继续优化---------------------------------------------- 我们阅读上面的资料就会发现strcpy的返回

    2024年02月20日
    浏览(26)
  • 你应该知道的C语言干货(3)(strcat和strcmp的模拟实现)

     我们知道包含string.h头文件后,就可以使用strcat和strcmp这两个库函数,strcat是用来连接两个字符串的,strcmp是比较两个字符串的大小,接下来我们将模拟实现他们。 #下期预告: strncpy strncat strncmp strstr strtok

    2024年02月13日
    浏览(29)
  • C语言 字符串解析strchr/strrchr/strtok//strtok_r函数使用

    在程序中,解析用户输入的参数(命令行参数)是很常见的操作,本文将讲解C语言中常见的一些解析字符串函数使用方法。 1 strchr 1.1 描述 strchr() 用于查找字符串中的一个字符,并返回该字符在字符串中第一次出现的位置。其原型定义在头文件 string.h 中。 char *strchr(const ch

    2024年02月03日
    浏览(33)
  • C语言 strtok字符串分割函数详解

    strtok 函数的作用是比较独特的,可以用来对字符串进行分割,对于我们获取命令或者数据集合后的数据处理是不可或缺的一步。但是详细介绍 strtok 的博文很少,而且linux手册的介绍也比较简单,这边写篇博文记录一下学习到的这个函数的用法。 函数定义如下: 即从字符串

    2024年02月12日
    浏览(34)
  • C语言中的strtok()函数进行字符串分割

    引言         在处理文本或字符串数据时,我们常常需要将一长串连续的字符按照特定的分隔符分解成一个个独立的子串。C语言中提供了一个非常实用的库函数—— strtok() ,用于实现这一功能。本文将通过一段示例代码详细解析并演示如何使用 strtok() 函数进行字符串分

    2024年01月23日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包