【c语言】字符函数与字符串函数(上)

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

大家好呀,今天给大家分享一下字符函数和字符串函数,说起字符函数和字符串函数大家会想到哪些呢??我想到的只有求字符串长度的strlen,拷贝字符串的strcpy,字符串比较相同的strcmp,今天,我要分享给大家的是我们一些其他的字符函数和字符串函数,跟着小张一起去看看吧!

前言

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串中或者字符数组 中.字符串常量 适用于那些对它不做修改的字符串函数


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

strcat

功能:可以在一个字符串后面追加字符
函数声明:char *strcat( char *strDestination, const char *strSource );
头文件:string.h
参数解释以及返回值解释:第一个参数接收被追加字符串数组的地址,第二个参数是追加的内容字符串数组,返回的是追加后字符串数组的地址
【c语言】字符函数与字符串函数(上),c语言

#define _CRT_SECURE_NO_WARNINGS

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

int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "gh";
	strcat(arr1, arr2);
	printf("%s", arr1);


}

注意:源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。

int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = {'a','b','c'};
	strcat(arr1, arr2);
	printf("%s", arr1);
}

【c语言】字符函数与字符串函数(上),c语言
程序发生崩溃,arr2数组如果没有’\0’的话,他会在后面地址上找到\0,在追加到arr1数组的时候,会越界放不下

字符串strcat函数不能自己给自己追加

追加前【c语言】字符函数与字符串函数(上),c语言
追加后
【c语言】字符函数与字符串函数(上),c语言
追加的时候把源数组中的‘\0’被追加字符所覆盖


长度受限制的字符串函数

strncpy

功能:拷贝num个字符从源字符串到目标空间
函数声明:char * strncpy ( char * destination, const char * source, size_t num );
头文件:string.h
参数:第一个参数为接收目标空间地址,第二个参数接收是源空间地址,返回参数是目标地址,size_t是无符号整数类型,num是拷贝字符的数目

#define _CRT_SECURE_NO_WARNINGS

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

int main()
{
	char arr1[40] = "hered ";
	char arr2[] = "ll";
	strncpy(arr1,arr2,2);
	printf("%s",arr1);
}

【c语言】字符函数与字符串函数(上),c语言

如果源字符小于要拷贝的个数会怎么样??

int main()
{
	char arr1[40] = "hered+++++++++ ";
	char arr2[] = "ll";
	strncpy(arr1, arr2, 10);
	printf("%s", arr1);
}

【c语言】字符函数与字符串函数(上),c语言
【c语言】字符函数与字符串函数(上),c语言

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


strncat

功能:追加num个字符从源字符串到目标空间。
声明:char * strncat ( char * destination, const char * source, size_t num );
头文件:string.h
参数:第一个参数为接收目标空间地址,第二个参数接收是源空间地址,返回参数是目标地址,size_t是无符号整数类型,num是追加字符的数目

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[40] = "hello ";
	char arr2[13] = "shuxiansheng";
	strncat(arr1, arr2, 3);
	printf("%s",arr1);
}

【c语言】字符函数与字符串函数(上),c语言

strncat可以追加自己

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[40] = "hello ";
	char arr2[13] = "shuxiansheng";
	strncat(arr1, arr1, 5);
	printf("%s",arr1);
}

【c语言】字符函数与字符串函数(上),c语言


strncmp

功能:可以比较指定个数的字符串比较
声明:int strncmp ( const char * str1, const char * str2, size_t num );
头文件:string.h
参数:第一个参数接收第一个字符串地址,第二个参数接收第二个字符串地址,第三个参数为比较字符的个数,比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[6] = "hello";
	char arr2[] = "helld";
	int ret=strncmp(arr1, arr2, 4);
	printf("%d", ret);
}

【c语言】字符函数与字符串函数(上),c语言

比较前四个字符,由于前四个字符相同,返回0,比较五个字符,o的ascll码值大于d的ascll码值返回1;


字符串查找

strstr

功能:查找子串
声明: char * strstr ( char * str1, const char * str2 );
头文件string.h
参数:第一个参数接收被查找的字符串的首地址,第二个参数疑似子串的字符串的首地址
如果是子串的话,返回字符串中子串的首地址,不是子串的话返回空指针【c语言】字符函数与字符串函数(上),c语言

代码

int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "fg";
	char *p=strstr(arr1,arr2);//保存返回子串的首地址
	if (p)
	{
		printf("是子串:%s", p);
	}
	else
	{
		printf("不是子串");
	}

}

编译运行

【c语言】字符函数与字符串函数(上),c语言
【c语言】字符函数与字符串函数(上),c语言


strtok

功能:分隔子串
声明:char * strtok ( char * str, const char * sep );
头文件:string.h
参数:第一个参数接收被分解字符串的地址,第二个参数中接收的是字符串中分隔符的地址,返回被分隔子串的首地址

代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "hello@qq.com";
	char arr2[] = "@.";
   strtok(arr1, arr2);
   printf("%s", arr1);
}

编译运行
【c语言】字符函数与字符串函数(上),c语言

第一个参数指定一个字符串,它包含了0个或者多个由arr2字符串中一个或者多个分隔符分割的标记。
strtok函数找到arr1中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。
strtok函数的第一个参数不为 NULL ,函数将找到arr1中第一个标记,strtok函数将保存它在字符串中的位置(strtok函数在内部维护了一个静态变量保存这个位置)。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回 NULL 指针

代码展示

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "hello@qq.com";
	char arr2[] = "@.";
	printf("%s\n", strtok(arr1, arr2));

   printf("%s\n", strtok(NULL, arr2));

	printf("%s\n", strtok(NULL, arr2));
   
}

编译运行
【c语言】字符函数与字符串函数(上),c语言

修改:我们可以将字符串arr1传给strtok函数,第一个@分隔符。strtok函数返回字符串中第一个遇到分隔符之前的字符串首地址,”hello’',然后在循环中继续调用strtok函数,第一个参数传NULL,strtok自己维护的静态变量,记住上次分隔的地方,不用在传arr1.

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "hello@qq.com";
	char arr2[] = "@.";
	char* p =NULL;
	for (p = strtok(arr1, arr2); p != NULL; p = strtok(NULL, arr2))
	{
		printf("%s\n",p);
	}


}

编译运行
【c语言】字符函数与字符串函数(上),c语言


错误信息报告

strerror

功能:可以返回指向错误信息字符串地址
声明:char *strerror( int errnum );
头文件:string.h errno.h
参数:errnum是错误码,就像404页面,每个错误码对应着错误信息,返回值是指向错误信息字符串地址

int main()
{
	printf("%s\n", strerror(0));
	printf("%s\n", strerror(1));
	printf("%s\n", strerror(2));
	printf("%s\n", strerror(3));


}

【c语言】字符函数与字符串函数(上),c语言

当我们向内存申请空间时,我们会使用malloc函数,如果申请的内存太大,是否会报错呢??它会将错误码放在整型全局变量errno中,使用errno时引用头文件errno.h

代码展示:

`#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
	  int *p=malloc(4000000000);//malloc申请内存失败会返回空地址
	  if (p == NULL)
	  {
		  printf("%s\n", strerror(errno));
	  }

}`

【c语言】字符函数与字符串函数(上),c语言

注意:遇到多个错误时,errno会不断赋新的错误码


模拟实现

strcat的模拟实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* mystrcat(char* p, char* q)
{
	assert(p && q);
	char* k = &p;//随着p++,会丢失目标字符串首地址先保存
	while (*p)
	{
		p++;
	}//将p指针移动到目标字符串'\0'位置
	while ((*p++=*q++))//将*q的值先给*p,然后两个q++;p++;赋值后的ascll值不为0,继续循环,当*q=='\0',赋值后ascll码值为'\0',退出循环
	{
	}
	return k;//返回目标字符串首地址
}
int main()
{
	char arr1[20] = "abcde";
	char arr2[5] = "qqq";
	mystrcat(arr1, arr2);
	printf("%s", arr1);

}

【c语言】字符函数与字符串函数(上),c语言


strstr的模拟实现

char* mystrstr(char* str1, char* str2)
{
	char* s1 = str1;//两个遍历指针分别指向两个字符串的首地址
	char* s2 = str2;
	char* cur = s1;//两个字符串开始匹配的指针
	while (*cur)//每循环一次,就是重新匹配的过程
	{
		s1 = cur;//s1移动到下一个开始匹配的位置
		s2 = str2;//子串要从头开始匹配
		while (*s1&&*s2&&(*s1 == *s2))//匹配的循环
		{
			s1++;
			s2++;
        }
		                            //不匹配退出循环
		if (*s2 == '\0')//当匹配循环完,s2的指针指向子串的末尾'\0';
		{
			return cur;//保存的是匹配成功时,字符串中匹配到的第一个字符首地址
		}
		cur++;                       //此时cur指向的位置不能作为开始匹配的位置,cur++;开始新一轮的匹配

    }
	return NULL;//当cur遍历完字符串,则说明没有该子串
}
int main()
{
	char arr1[] = "abcdecdfg";
	char arr2[] = "cdf";
	char *p=mystrstr(arr1,arr2);//如果找到子串返回字符串中和子串匹配的首字符首地址不为空
	if (p)
	{
		printf("是子串");
	}
	else
	{
		printf("不是子串");
	}

}

编译运行
【c语言】字符函数与字符串函数(上),c语言
【c语言】字符函数与字符串函数(上),c语言


总结

字符串函数,字符函数在处理字符问题特别的方便,使得问题简单化,本章还未讲到的内存操作函数放在下一篇讲,如果你觉得这篇文章对你有帮助的话,别忘了给小张点赞,收藏加关注,哪里不对的话还望大佬们指教,谢谢大家!!我会持续分享给大家自己学到的知识,也是在好好的做总结文章来源地址https://www.toymoban.com/news/detail-645735.html

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

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

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

相关文章

  • C语言——字符函数和字符串函数

    assert.h 头文件定义了宏assert(),⽤于在运⾏时确保程序符合指定条件,如果不符合,就报 错终⽌运⾏。这个宏常常被称为 “断⾔” 。 assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert() 不会产⽣任何作⽤,程序继续运⾏。如果该表达式为假(

    2024年04月25日
    浏览(53)
  • C语言:字符函数和字符串函数

    C语言:初识C语言 C语言:分支语句和循环语句 C语言:函数 C语言:数组 C语言:操作符详解 C语言:指针详解 C语言:结构体 C语言:数据的存储 今天来盘一下字符函数和字符串函数。 C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常

    2024年02月11日
    浏览(67)
  • C语言字符函数和字符串函数详解

           Hello, 大家好,我是一代,今天给大家带来有关字符函数和字符串函数的有关知识        所属专栏:C语言        创作不易,望得到各位佬们的互三呦 在C语言中有一些函数是专门为字符设计的,这些函数的使用都需要包含一个头文件ctype.h 如:(注:以下函数原型都

    2024年03月20日
    浏览(51)
  • C语言——字符函数和字符串函数(二)

    📝前言: 上一篇文章C语言——字符函数和字符串函数(一)对 字符函数和字符串函数 strlen , strcpy 和 strncpy , strcat 和 strncat 进行了初步的讲解 这篇文章主要再讲解几个我们 常用到的其他字符串函数 (附上实例): 1,strcmp和strncmp 2,strstr 🎬个人简介:努力学习ing 📋个

    2024年02月04日
    浏览(46)
  • 【C语言】字符函数和字符串函数(1)

    #国庆发生的那些事儿# 大家好,我是苏貝,本篇博客带大家了解字符函数和字符串函数,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 求字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数介绍 strncpy strncat strncmp 字符串查

    2024年02月08日
    浏览(35)
  • C语言——字符函数和字符串函数(一)

    📝前言: 这篇文章对我最近学习的有关 字符串的函数 做一个总结和整理,主要讲解 字符函数和字符串函数(strlen,strcpy和strncpy,strcat和strncat)的使用方法,使用场景和一些注意事项 (附上实例) 🎬个人简介:努力学习ing 📋个人专栏:C语言入门基础 🎀CSDN主页 愚润求

    2024年02月04日
    浏览(63)
  • 进阶C语言-字符函数和字符串函数

    ✅注意事项: 字符串以 \\\'\\0\\\' 作为结束标志, strlen函数 返回的是在字符串中 \\\'\\0\\\' 前面出现的字符个数(不包括 \\\'\\0\\\' ) 参数指向的字符串必须以 \\\'\\0\\\' 结束 注意函数的返回值是 size_t ,是无符号的 ✅运行示例: 🔭1.1.1strlen函数的模拟实现 📖1.计数器法 assert函数 的 作用 是断言,

    2024年02月04日
    浏览(48)
  • 【c语言】字符函数与字符串函数(上)

    大家好呀,今天给大家分享一下字符函数和字符串函数,说起字符函数和字符串函数大家会想到哪些呢??我想到的只有求字符串长度的strlen,拷贝字符串的strcpy,字符串比较相同的strcmp,今天,我要分享给大家的是我们一些其他的字符函数和字符串函数,跟着小张一起去看看吧

    2024年02月13日
    浏览(74)
  • 【C语言基础】:字符函数和字符串函数

             书山有路勤为径,学海无涯苦作舟。 创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~ 1. 字符分类函数 C语言中有一系列的函数是对字符进行分类的,就是对判断一个字符属于什么类型的字符,这类字符函数的使用都要包含一个头文件

    2024年04月17日
    浏览(42)
  • C语言——详解字符函数和字符串函数(二)

    Hi,铁子们好呀!之前博主给大家简单地介绍了部分 字符和字符串函数 ,那么这次,博主将会把这些字符串函数给大家依次讲完! 今天讲的具体内容如下: 6.1.1 strcmp 函数介绍 它的函数原型如下: 具体的函数介绍如下图所示: 从图中我们得知: - 如果第一个字符串 PTR1 大于

    2024年04月10日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包