常见的字符函数与字符串函数介绍(1)

常见的字符函数与字符串函数介绍

前言

C语言中对字符与字符串的处理很是频繁,但是C语言中并没有字符串类型的变量,字符串通常存放在常量字符串或者字符数组中。字符串常量适用于那些对它不做任何修改的字符串函数。

函数功能简介与再实现

1、 strlen函数

函数原型:size_t strlen (const char * str);
该函数用于计算字符串的长度

函数简介

  1. 字符串一定以'\0'作为结束标志,strlen函数返回的是字符串'\0'之前出现的字符个数(不包括'\0'
  2. 参数指向的字符串必须要以'\0'结束
  3. 注意函数的返回值为size_t,是无符号的(易错
  4. 学会strlen函数的模拟实现

模拟实现

计数器方式实现函数

int my_strlen (const char * str)
{int count = 0;while (*str){count++;str++;}return count;
}

不创建临时变量计数,使用递归方式

int my_strlen (const * str)
{if(*str == '\0')return 0;elseretrun 1 + my_strlen(*str+1);
}

指针-指针的方式实现

int my_strlen (char * s)
{char * p = s;while (*p != '\0')p++;return p-s;
}

三种方式均可以实现strlen函数,都应进行掌握。

2、strcpy函数

函数原型 char * strcpy(char * destination, const char * source);
该函数用于实现字符串的拷贝

函数简介

  1. Copies the C string pointed by source into the array pointed by
    destination, including the terminating null character (and stopping
    at that point).
  2. 源字符串必须以 ‘\0’ 结束。
  3. 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  4. 目标空间必须足够大,以确保能存放源字符串。
  5. 目标空间必须可变。
  6. 学会模拟实现

模拟实现

//1.参数顺序
//2.函数功能与停止条件
//3.assert
//4.const修饰指针
//5.函数的返回值
char* my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest != NULL);assert(src != NULL);while ((*dest++ = *src++)){;}return ret;

3、strcat函数

函数原型`char * strcat(char * destination,const char * source);
该函数用于实现字符串的连接

函数简介

  1. Appends a copy of the source string to the destination string. The
    terminating null character indestination is overwritten by the first
    character of source, and a null-character is included at the end of
    the new string formed by the concatenation of both in destination.
  2. 源字符串必须以 '\0' 结束。
  3. 目标空间必须有足够的大,能容纳下源字符串的内容。
  4. 目标空间必须可修改。
  5. 字符串自己不能给自己追加

模拟实现

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

4、strcmp函数

函数原型:int strcmp (const char * str1,const char * str2 );
该函数用于比较两个字符串的大小

函数简介

  1. This function starts comparing the first character of each string.
    If they are equal to each other, it continues with the following
    pairs until the characters differ or until a terminating
    null-character is reached.
  2. 标准规定: 第一个字符串大于第二个字符串,则返回大于0的数字
    第一个字符串等于第二个字符串,则返回0
    第一个字符串小于第二个字符串,则返回小于0的数字

模拟实现

int my_strcmp(const char* src, const char* dst)
{int ret = 0;assert(src != NULL);assert(dest != NULL);while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)++src, ++dst;if (ret < 0)ret = -1;else if (ret > 0)ret = 1;return(ret);
}

5、strncpy函数

函数原型:char * strncpy (char * destination,const char * source, size_t num);
该函数用于从源字符中拷贝num个字符到目标空间。

函数简介·

  1. Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.
  2. 拷贝num个字符从源字符串到目标空间
  3. 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
  4. 如果目标空间大小大于num,则目标空间num之后的内容不会发生改变

模拟实现

#include<stdio.h>
#include<stdlib.h>char* My_strncpy(const char*a, char* b, size_t sz)
{size_t i = 0;for(i = 0; i < sz; i++)//拷贝n个字符{*(b+i) = *(a+i);}*(b+i) = '\0';return b;
}int main()
{char a[] = "asdfdgddh";char b[] = {0};char *p = My_strncpy(a, b, 3*sizeof(a[0]));printf("%s", p);system("pause");return 0;
}

6、strncat函数

函数原型:char * strncat(char * destination ,const char * source, size_t num);
该函数用于再在目标空间的原有内容之后追加num个字符

函数简介

  1. Appends the first num characters of source to destination, plus a terminating null-character.
  2. If the length of the C string in source is less than num, only the content up to the terminating nullcharacter is copied.

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;
}

运行结果

To be or not

模拟实现

#include<stdlib.h>
#include<stdio.h>
#include<assert.h>char *My_strncat(char *n_a, const char *n_b, size_t sz)
{assert(n_a);assert(n_b);char *c = n_a;while(*n_a != '\0')//找到‘\0’的位置{n_a++;}while(sz--)//向后追加字符{*n_a++ = *n_b++;}*n_a = '\0';//最后结束时加'\0'return c;
}int main()
{char a[] = "asdfghjk";char b[] = "ZXCFGHJ";char* p = My_strncat(a, b, 3*sizeof(a[0]));printf("%s", p);system("pause");return 0;
}

7、strncmp函数

函数原型:int strncmp (const char * str1, sonst char *str2, size_t num);
该函数用于比较两个字符串前num个字符的大小

函数简介

  1. 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完
    在这里插入图片描述

举个栗子

#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;
}

运行结果

Looking for R2 astromech droids...
found R2D2found R2A6

8、strstr函数

函数原型:char * strstr (const char * ,const char * );
该函数用于在arr1字符串中查找arr2字串第一次出现的位置,并返回其首地址

函数简介:

  1. Returns a pointer to the first occurrence of str2 in str1, or a null
    pointer if str2 is not part of str1.

举个栗子

#include <stdio.h>
#include <string.h>
int main ()
{char str[] ="This is a simple string";char * pch;pch = strstr (str,"simple");strncpy (pch,"sample",6);puts (pch);return 0}

运行结果

sample string

模拟实现

char* my_strstr(const char* str1, const char* str2)
{assert(str1);assert(str2);char* cp = (char*)str1;char* substr = (char*)str2;char* s1 = NULL;if (*str2 == '\0')return NULL;while (*cp){s1 = cp;substr = str2;while (*s1 && *substr && (*s1 == *substr)){s1++;substr++;}if (*substr == '\0')return cp;cp++;}
}

9、strtok函数

函数原型:char * strtok (char * str ,const char * sep);

函数简介

  1. sep参数是个字符串,定义了用作分隔符的字符集合

  2. 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。

  3. strtok函数找到str中的下一个标记,并将其用 \0结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)

  4. strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

  5. strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

  6. 如果字符串中不存在更多的标记,则返回 NULL 指针。

具体解释

char * arr[] = "lpt@bitedu.tech";

其中,@.称为分隔符

char * p = "@,.";

p为分隔符的合集

strtok(arr,p);

此函数第一次调用,会将@改为\0,并返回l的地址
第二次调用,会将.改为\0,并返回b的地址

举个栗子

#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;
}

运行结果

Splitting string "- This, a sample string." into tokens:
This
a
sample
string

10、strerror函数

函数原型:char * strerror (int errum);
该函数为错误报告函数,会将错误码转换为对应的错误信息

函数简介

  1. 必须包含的头文件#include <errno.h>;
错误码错误信息
0Not error
1Operation not permitted
2No much file or directory
3No much process

举个栗子

#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; 
} 
Edit & Run 

11、字符分类函数

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

12、字符转换函数

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

举例

#include <stdio.h>
#include <string.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;
}

运行结果

test string.

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postman raw带文件_postman raw模拟各种http post请求

在url或者query里面传递参数这个最简单http://localhost:5000/queryhttp://localhost:5000/query/xxxhttp://localhost:5000/query/idxxx上传表单key-value数据1.使用自带的功能body设置header设置2.使用raw来模拟body设置header设置不变上传单个文件1.使用自带功能body设置hea…

找第一个只出现一次的字符_剑指offer 字符流中第一个只出现一次的字符

题目描述&#xff1a;请实现一个函数用来找出字符流中第一个只出现一次的字符。例如&#xff0c;当从字符流中只读出前两个字符"go"时&#xff0c;第一个只出现一次的字符是g。当从该字符流中读出前六个字"google"时&#xff0c;第一个只出现一次的字符是l…

win10无法装载重装系统iso文件_win10镜像不能安装系统如何解决_win10镜像无法安装处理方法...

如今&#xff0c;大部分用户下载到的win10系统都是属于镜像文件&#xff0c;能够最大便利的让用户安装步骤简单化&#xff0c;可是最近有用户下载的win10系统中出现了镜像不能安装的问题&#xff0c;那么win10镜像不能安装系统如何解决呢&#xff1f;下面就来告诉大家win10镜像…

anaconda下载jupyter写python_如何安装Anaconda3和使用Jupyter

如何安装Anaconda3和使用Jupyter发布时间&#xff1a;2020-10-28 14:41:26来源&#xff1a;亿速云阅读&#xff1a;64作者&#xff1a;Leah这期内容当中小编将会给大家带来有关如何安装Anaconda3和使用Jupyter&#xff0c;文章内容丰富且以专业的角度为大家分析和叙述&#xff…

mysql 42642 安装报错_1/5 MySQL入门总结:下载安装

MySQL.msi版本下载&#xff1a;www.mysql.com >DOWNLOADS >Windows >MySQL Installer >mysql-installer-community-8.0.13.0.msi(不建议下载解压缩版&#xff0c;因为它还要配置my.ini文件&#xff0c;亲身实践&#xff0c;麻烦)安装&#xff1a;o. 缺失“Microsof…

java 3位小数_数字有效小数第三位四舍五入

[java]代码库import javax.swing.JOptionPane;public class Test{public static void main(String[] args){String sJOptionPane.showInputDialog("请输入数字&#xff1a;");double aDouble.parseDouble(s);//转换成数字double ba;//临时存储int p0;//用于计算小数从…

java实现文件合并_Java实现文件分割和文件合并实例

文件切割和文件合并这个问题困扰了我有一段时间了(超过一天没做粗来)。找了好多博客&#xff0c;本来想转载一个来的 结果找不到了。很无奈。只好自己贴代码上了。当然我会尽力好好写注释的。文件切割器:import java.io.File;import java.io.FileNotFoundException;import java…

java 常量表达式_JavaSwitch语句:常量表达式是必需的,但它是常量

万千封印我知道编译器需要在编译时知道表达式才能编译一个开关&#xff0c;但是为什么foo.ba_常数不是呢&#xff1f;虽然从字段初始化后执行的任何代码的角度来看&#xff0c;它们都是常量&#xff0c;但它们不是编译时间常数在JLS所要求的意义上&#xff1b;见15.28常量表达式…

java web 开发技术大全 代码_Java Web开发技术大全

资深程序员全力打造&#xff0c;深入剖析SSH框架整合开发的精髓 全方位解读Java Web开发的基础知识、高级技术及应用案例 内容全面&#xff0c;讲解详细&#xff0c;全面覆盖JSP、Se rvlet、AJAX及SSH框架整合开发 避免冗长的理论讲解&#xff0c;而是直击主题&#xff0c;通过…

java nio doug_深入的聊聊 Java NIO

趁着三天假期&#xff0c;把Java NIO和Reactor模式整理总结了下&#xff0c;文章特别细节的知识点没有写&#xff0c;如一些API的具体实现。类似数据读到Buffer后再写出时&#xff0c;为什么需要复位操作&#xff0c;这些都属于NIO基础知识&#xff0c;是学习Reactor模式的前置…

java clone原理_详解Java中的clone方法 -- 原型模式

Java中对象的创建clone顾名思义就是复制&#xff0c; 在Java语言中&#xff0c; clone方法被对象调用&#xff0c;所以会复制对象。所谓的复制对象&#xff0c;首先要分配一个和源对象同样大小的空间&#xff0c;在这个空间中创建一个新的对象。那么在java语言中&#xff0c;有…

portal认证 java_华为5700交换机通过外部开源protal和本地aaa用户认证的一些问题

各位&#xff1a;您好&#xff0c;我通过一台华为5700交换机和一台portal服务器&#xff0c;想利用交换机本地的aaa认证&#xff0c;完成用户的上网认证。配置好后&#xff0c;用户可以重地向到portal页面&#xff0c;但是认证不能通过&#xff0c;具体配置如下&#xff1a;一、…

java复制一个对象_Java中对象的复制

假如说你想复制一个简单变量。很简单:1 int n 5;2 int m n;不仅仅是int类型&#xff0c;其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。但是如果你复制的是一个对象&#xff0c;情况就有些复杂了。假设说我是一个beginner&#xff0c…

HA集群实现原理 切换 JAVA_HA(一)高可用集群原理

高可用集群原理LVS集群DR模式简单的架构图如下所示&#xff1a;在上图的架构中&#xff0c;当Director服务器因软件、硬件、人为原因造成故障时&#xff0c;整个集群服务不可用&#xff0c;因此&#xff0c;需要再添加一台服务器实现Director服务高可用。整个系统的架构图如下所…

c语言指针没学可以学java_这是一篇来自刚脱离C语言的菜鸟所写下来的关于C语言之后转JAVA入门前期学习的感想...

/***My First writing*Name Li Tai Yue*Date 2018.12.14*/这是一篇来自刚脱离C语言的菜鸟所写下来的关于C语言之后转JAVA入门前期学习的感想。并且我也觉得这是一篇所有在校学习程序的小伙伴值得一看的文章。我想很多小伙帮都觉得敲代码是一件非常枯燥的事情&#xff0c;每天敲…

java 如何将数字倒置_每日一个小算法之整数中每位上的数字进行反转 20190810

题目要求&#xff1a;给出一个32位的有符号整数&#xff0c;你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21示例 4:输入&#xff1a;9646324351输出: 0注意&#xff1a;假设我们的环境只能存储得下 3…

java se 开发web程序_JDiy快速开发WEB之javaSE环境搭建-初级

大学的时候对web开发很感兴趣&#xff0c;对网页中的动画&#xff0c;对用户注册&#xff0c;对网页中表格填写等等都倍感兴趣。加之又有专业课程编程语言java&#xff0c;因此&#xff0c;对java web产生了浓厚的兴趣&#xff0c;再加之有北京圣思园 风中叶 大师的视频教程&am…

java apktoo_apktool.jar

apktool.jar是APKTOOL这个反编译工具必须用到的必备jar包&#xff0c;给大家提供最新的apktool.jar2.3.4&#xff0c;有需要的赶快下载吧&#xff01;。相关软件软件大小版本说明下载地址apktool.jar是APKTOOL这个反编译工具必须用到的必备jar包&#xff0c;给大家提供最新的ap…

Java 内存 关系_JVM和Linux之间的详细内存关系

JVM和Linux之间的详细内存关系在一些具有8g物理内存的服务器上&#xff0c;主要运行Java服务。系统内存分配如下&#xff1a;Java服务的JVM堆大小设置为6g&#xff0c;监视过程大约需要600m&#xff0c;Linux本身使用大约800m。从表面上看&#xff0c;物理记忆应该足够&#xf…

java遍历删除原理,Java 垃圾回收机制实现原理

一、垃圾回收机制的意义Java语言中一个显著的特点就是引入了垃圾回收机制&#xff0c;使c程序员最头疼的内存管理的问题迎刃而解&#xff0c;它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制&#xff0c;Java中的对象不再有“作用域”的概念&…