关于字符串的相关操作有 输入、输出、合并、修改、比较、转换、复制、搜索等等

一、字符串I/O

  • 宏定义文件指针:标准输入设备stdin、标准输出设备stdout、标准错误设备stderr

  • 字符串输出
    putchar()、puts()、fputc()、fputs()这些函数也是标准 I/O 函数,标准C库函数,且应层的函数是有缓冲的,性能和效率要比系统调用要高。

/*
@  puts函数
@  头文件:#include <stdio.h>
@  s:需要进行输出的字符串
@  返回值:成功返回一个非负数;失败将返回 EOF,EOF 其实就是-1
@  使用 puts()函数连换行符' \n '都省了,函数内部会自动在其后添加一个换行符。
*/
int puts(const char *s)/*
@  fputc 函数
@  头文件:#include <stdio.h>
@  c:需要进行输出的字符
@  返回值:出错将返回 EOF
*/
int fputc(int c,FILE *stream);
fputc('A', stdout);/*输出到标准设备*/
fp = fopen("./new_file", "a");
fputc('A', fp);/*输出到标准文件*//*
@  fputs 函数
@  头文件:#include <stdio.h>
@  c:需要进行输出的字符
@  stream:文件指针。就是用fopen打开返回的值
@  返回值:成功时返回输出的字符;出错将返回 EOF
@  putchar()只能输出到标准输出设备,而 fputc()可把字符输出到指定的文件中,既可以是标准输出、标准错误设备,也可以是一个普通文件
*/
int fputs(const char *s, FILE *stream);
fputs("Hello World! 2\n", stdout);/*输出到标准设备*/
fp = fopen("./new_file", "a");
fputs("Hello World! 2\n", fp);/*输出到文件*/
  • 字符串输入
    与 scanf()一样,gets()、getchar()、fgetc()、fgets()这些函数也是标准 I/O 函数
/*
@  gets函数
@  头文件:#incluede <stdio.h>
@  s:指向字符数组的指针,用于存储字符串
@  返回值:如果成功,该函数返回指向 s 的指针,如果发生错误或者到达末尾时还未读取任何字符,则返回 NULL。
*/
char *gets(char *s);/*
@  getchar函数用于从标准输入设备读取一个字符
@  头文件:#include<stdio.h>
@  无需传参
@  返回值:该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF
*/
int getchar(void);
ch = getchar();/*从键盘读取字符*//*
@  fgets函数
@  头文件:#include <stdio.h>
@  s:指向字符数组的指针,用于存储字符串
@  size:这是要读取的最大字符数
@  stream:文件指针
*/
char *fgets(char *s, int size, FILE *stream);
fgets(str, sizeof(str), stdin);/*读取字符串*//*总结一下:
@  gets()只能从标准输入设备中获取输入字符串,而 fgets()既可以从标准输入设备获取字符串、也可以从一个普通文件中获取输入字符串。
@  fgets()可以设置获取字符串的最大字符数
@  gets()会将缓冲区中的换行符'\n'读取出来、将其丢弃、将'\n'替换为字符串结束符'\0';fgets()也会将缓冲区中的换行符读取出来,但并不丢弃,而是作为字符串组成字符存在,读取完成之后自动在最后添加字符串结束字符'\0'。
*//*
@  fgetc函数
@  头文件:#incldue <stdio.h>
@  用于读取一个输入字符
@  stream:文件指针
@  返回值:该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。
*/
int fgetc(FILE *stream);

二、字符串处理

1、字符串长度

/*
@  strlen函数==计算字符串长度的函数
@  s:需要进行长度计算的字符串,字符串必须包含结束字符' \0 '
@  返回值:返回字符串长度(以字节为单位),字符串结束字符' \0 '不计算在内。
*/
size_t strlen(const char* s)
/*
sizeof和strlen的区别:
1、sizeof 是 C 语言内置的操作符关键字,而 strlen 是 C 语言库函数;
2、sizeof 仅用于计算数据类型的大小或者变量的大小,而 strlen 只能以结尾为'\0'的字符串作为参数
3、编译器在编译时就计算出了 sizeof 的结果,而 strlen 必须在运行时才能计算出来
4、sizeof 计算数据类型或变量会占用内存的大小,strlen 计算字符串实际长度
*/

2、字符串拼接

/*
@  strcat函数或者strncat函数用于连接两个字符串
@  头文件:#include <string.h>
@  dest:目标字符串
@  src:源字符串
@  返回值:返回指向目标字符串 dest 的指针
@  ,所以必须要保证 dest 有足够的存
储空间来容纳两个字符串,否则会导致溢出错误;dest 末尾的' \0 '结束字符会被覆盖,src 末尾的结束字符' \0 '会一起被复制过去,最终的字符串只有一个' \0
*/
char *strcat(char *dest,const char *src);/*
@  strncat函数
@  头文件:#include <string.h>
@  dest:目标字符串。
@  src:源字符串。
@  n:要追加的最大字符数
@   返回值:返回指向目标字符串 dest 的指针
@  strncat()与 strcat()的区别在于,strncat 可以指定源字符串追加到目标字符串的字符数量
*/
char *stmcat(char *dest,const char *src,size_t n);

3、字符串拷贝

/*
@  strcpy函数
@  头文件:#include <string.h>
@  dest:目标字符串
@  src:源字符串
@  返回值:返回指向目标字符串 dest 的指针
@  strcpy()会把 src(必须包含结束字符' \0 ')指向的字符串复制(包括字符串结束字符' \0 ')到 dest
*/
char *strcpy(char *dest,const char *src);/*
@  strncpy函数
@  头文件:
@  n:从 src 中复制的最大字符数
@  返回值:返回指向目标字符串 dest 的指针
@  strncpy()可以指定从源字符串 src 复制到目标字符串 dest 的字符数量
@  把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 n 小于或等于 src 字符串长度(不包括结束字符的长度)时,则复制过去的字符串中没有包含结束字符' \0 ';当 n 大于 src 字符串长度时,则会将 src 字符串的结束字符' \0 '也一并拷贝过去,必须保证 dest 指向的内存空间足够大,能够容纳下拷贝过来的字符串,否则会导致溢出错误
*/
char *strncpy(char *dest, const char *src, size_t n);/*除了 strcpy()和 strncpy()之外,其实还可以使用 memcpy()、memmove()以及 bcopy()这些库函数实现拷贝操作,*/

4、内存填充

  • 需要将某一块内存中的数据全部设置为指定的值,譬如在定义数组、结构体这种类型变量时,通常需要对其进行初始化操作,而初始化操作一般都是将其占用的内存空间全部填充为 0
/*
@  memset 函数
@  头文件:#include <string.h>
@  s:需要进行数据填充的内存空间起始地址
@  c:要被设置的值,该值以 int 类型传递
@  n:填充的字节数
@  返回值:返回指向内存空间 s 的指针
@  但 memset()函数在填充内存块时是使用该值的无符号字符形式,也就是
函数内部会将该值转换为 unsigned char 类型的数据,以字节为单位进行数据填充。
*/
void *memset(void *s, int c, size_t n);memset(str, 0x0, sizeof(str));/*对数组str进行初始化操作,将其存储的数据全部设置为0*//*
@  bzero 函数=bzero()函数用于将一段内存空间中的数据全部设置为 0
@  头文件:#include <string.h>
@  s:内存空间的起始地址
@  n:填充的字节数
@  返回值:无返回值
*/
void bzero(void *s, size_t n);
bzero(str, sizeof(str));/*将其存储的数据全部设置为 0*/

5、字符串比较

  • 了用于字符串比较的函数 strcmp()和 strncmp()
/*
@  strcmp函数
@  头文件: include <string.h>
@  s1:进行比较的字符串 1
@  s2:进行比较的字符串 2
@  返回值:⚫ 如果返回值小于 0,则表示 str1 小于 str2 ⚫ 如果返回值大于 0,则表示 str1 大于 str2⚫ 如果返回值等于 0,则表示字符串 str1 等于字符串 str2
@  strcmp 进行字符串比较,主要是通过比较字符串中的字符对应的 ASCII 码值,strcmp 会根据 ASCII 编码依次比较 str1 和 str2 的每一个字符,直到出现了不同的字符,或者某一字符串已经到达末尾(遇见了字符串结束字符' \0 ')
*/
int strcmp(const char *s1, const char *s2);/*
@  strncmp 函数
@  头文件:include <string.h>
@  s1:参与比较的第一个字符串
@  s2:参与比较的第二个字符串
@  n:最多比较前 n 个字符
@  返回值:返回值含义与 strcmp()函数相同
*/
int strncmp(const char *s1,const char *s2,size_t n);

6、字符串查找

  • 从一个给定的字符串当中查找某一个字符或者一个字符串,并获取它的位置
  • 用于字符串查找的函数,包括 strchr()、strrchr()、strstr()、strpbrk()、index()以及 rindex()等
/*
@  strchr函数==以查找到给定字符串当中的某一个字符
@  头文件:#include <string.h>
@  s:给定的目标字符串。
@  c:需要查找的字符。
@  返回值:返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c,则返回 NULL。
@  字符串结束字符' \0 '也将作为字符串的一部分,因此,如果将参数 c 指定为' \0 ',则函数将返回指向结束字符的指针。
*/
char *strchr(const char *s,int c);/*
@  strrchr函数===是从后到前
@  头文件:#include <string.h>
@  s:给定的目标字符串。
@  c:需要查找的字符。
@  返回值:返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c,
@  strrchr()函数在字符串中是从后到前(或者称为从右向左)查找字符,找到字符第一次出现的位置就返回,返回值指向这个位置
*/
char *strrchr(const char *s,int c)

7、字符串与数字互转

  • 经常会需要将数字组成的字符串转换为相应的数字、或者将数字转换为字符串
  • string==》int
    主要包括 atoi()、atol()、atoll()以及strtol()、strtoll()、strtoul()、strtoull()等
/*
@  atoi、atol、atoll 函数==分别对应int、long int 以及 long long 类型的数据
@  头文件:#include <string.h>
@  nptr:需要进行转换的字符串
@  返回值:分别返回转换之后得到的 int 类型数据、long int 类型数据以及long long 类型数据
*/
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);/*
@  strtol()、strtoll()两个函数可分别将字符串转为 long int 类型数据和 long long ing 类型数据
@  头文件:#include <string.h>
@  nptr:需要进行转换的目标字符串。
@  endptr:char **类型的指针,如果 endptr 不为 NULL,则 strtol()或 strtoll()会将字符串中第一个无效字符的地址存储在*endptr 中。如
@  base:数字基数,参数 base 必须介于 2 和 36(包含)之间,或者是特殊值 0
@  返回值:分别返回转换之后得到的 long int 类型数据以及 long long int 类型数据
@  strtol()、strtoll()可以实现将多种不同进制数表示的字符串转换为整形数据
*/
long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);/*
@  strtoul、strtoull 函数==使用方法与 strtol()、strtoll()一样,区别在于返回值的类型不同,strtoul()返回值类型是 unsignedlong int,strtoull()返回值类型是 unsigned long long int,
@  #include <stdlib.h>
*/
unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr, int base);
  • string==>float/double
    C 函数库中用于字符串转浮点型数据的函数有 atof()、strtod()、strtof()、strtold()
/*
@  atof 函数
@  #include <stdlib.h>
@  nptr:需要进行转换的字符串
@  返回值:返回转换得到的 double 类型数据
*/
double atof(const char *nptr);/*
@  strtod、strtof、strtold 函数
@  #include <string.h>
@  strtof()、strtod()以及 strtold()三个库函数可分别将字符串转换为 float 类型数据、double 类型数据、long
double 类型数据
*/
double strtod(const char *nptr, char **endptr);
float strtof(const char *nptr, char **endptr);
long double strtold(const char *nptr, char **endptr);
  • 数字转字符串
    printf()将数字转字符串、并将其输出到标准输出设备或者使用 sprintf()或 snprintf()将数字转换为字符串并存储在缓冲区中
sprintf(str, "%d", 500);sprintf(str, "%f", 500.111);sprintf(str, "%u", 500);

参考资料:正点原子linuxC编程应用指南.pdf

字符串(Linux应用编程篇)相关推荐

  1. Linux网络编程篇之ICMP协议分析及ping程序实现

    Linux网络编程系列: Linux网络编程篇之Socket编程预备知识 Linux网络编程篇之TCP协议分析及聊天室功能实现 如果对Linux网络编程,对socket通信不是太清楚的同学,强烈推荐看 ...

  2. 应用编程与裸机编程、驱动编程的区别(Linux应用编程篇)

    用嵌入式Linux硬件平台下的软件开发来说,我们大可将编程分为三种,分别为裸机编程.Linux驱动编程以及 Linux应用编程. 裸机编程: 一般把没有操作系统支持的编程环境称为裸机编程环境,譬如单片 ...

  3. linux tcp 服务器 c,Linux网络编程篇之Tcp协议介绍, C/S通信及聊天室实现

    基于tcp协议的网络程序流程图如下: tcp协议网络程序流程图 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态 客户端调用so ...

  4. Linux驱动编程篇(三)——LED驱动(一)简单LED驱动

    一.LED驱动程序的实现目标及流程图 1.打开LED 2.关闭LED 二.LED驱动程序的实现部分 1.内核层LED驱动程序 2.应用层LED测试程序 三.内核层LED驱动程序的编程步骤 1.添加头文 ...

  5. Linux系统中的文件类型(Linux应用编程篇)

    windows系统下,操作系统识别文件类型一般是通过文件名后缀来判断 虽然Linux系统并不会通过后缀来识别文件,但是文件后缀也要规范.需要根据文件本身的功能属性来添加. LInux系统下一共分为 7 ...

  6. docker常见面试题_测试面试题集锦(四)| Linux 与 Python 编程篇(附答案)

    本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群. 本系列文章总结归纳了一些软件测试工程师常见的面试题,主要来源于个人面试遇到的.网络搜集(完善).工作日常讨论等,分为以下十个部分,供大家参考.如 ...

  7. python中json如何存放字节数组中_测试面试题集锦(四)| Linux 与 Python 编程篇(附答案)...

    本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群. 本系列文章总结归纳了一些软件测试工程师常见的面试题,主要来源于个人面试遇到的.网络搜集(完善).工作日常讨论等,分为以下十个部分,供大家参考.如 ...

  8. 测试面试题集锦(四)| Linux 与 Python 编程篇(附答案)

    原文链接 本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群. 本系列文章总结归纳了一些软件测试工程师常见的面试题,主要来源于个人面试遇到的.网络搜集(完善).工作日常讨论等,分为以下十个部分,供大 ...

  9. 【Linux学习(3)】----C语言编程篇(1)

    一.环境搭建: 在Linux环境下先使用: sudo apt-get update 将下载源进行更新.在更新完毕之后,再使用 sudo apt-get install gcc 将C语言的编译器进行gc ...

  10. Linux之shell编程篇-----Shell 函数和Shell 输入/输出重定向

    ​ 最近发现了一个挺厉害的人工智能学习网站,内容通俗易懂,风趣幽默,感兴趣的可以点击此链接进行查看:床长人工智能教程 废话不多说,请看正文! ​ Shell 函数 1. 自定义函数 linux she ...

最新文章

  1. 如何在父进程中读取子(外部)进程的标准输出和标准错误输出结果
  2. 你的房东可能正用AI筛查你的犯罪记录,决定要不要租房给你
  3. Android之系统自带的文字外观设置
  4. 运维自动化------ansible搭建
  5. mysql查询交叉连接_复杂的MySQL查询,联合,交叉或自然连接?
  6. Lambda使用——JDK8新特性
  7. Python 日期和时间戳的转换
  8. python 彻底解读多线程与多进程_python 多进程与多线程浅析
  9. 经典面试题(23):以下代码将输出的结果是什么?
  10. 26. GD32F103C8T6入门教程-CAN外设回环测试
  11. Java中Arrays类的两个方法:deepEquals和equals
  12. dwz中的table
  13. Matplotlib 中文用户指南 8.2 我们最喜欢的秘籍
  14. Matlab之共轭转置与非共轭转置
  15. Eclipse连接小米手机无连接显示解决办法
  16. 【react学习笔记】为什么页面只展示空标签
  17. Java毕业设计-流浪动物救助系统
  18. List 接口中扩充的 10 个方法详解
  19. Spring-拦截器与过滤器
  20. Java实现QQ登陆界面的搭建

热门文章

  1. Android 9 (P) Zygote进程启动源码分析指南一
  2. 建站之星安装提示无法连接数据库
  3. 风玫瑰图的绘制,基于气象A文件(windrose)
  4. 百度识图API教程一:使用百度api识别物体
  5. SOLIDWORKS教程:solidworks常用技巧大全
  6. Python数据挖掘进阶--泰坦尼克号案例分析
  7. 在FPGA中,同步信号、异步信号和亚稳态的理解
  8. 鼎利测试软件 说明书,鼎利软件使用手册.docx
  9. 关于删除某文件需要TrustedInstaller权限的解决方法
  10. 曾经一学长的ACM总结帖,膜拜之。