字符串(Linux应用编程篇)
关于字符串的相关操作有 输入、输出、合并、修改、比较、转换、复制、搜索等等
一、字符串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应用编程篇)相关推荐
- Linux网络编程篇之ICMP协议分析及ping程序实现
Linux网络编程系列: Linux网络编程篇之Socket编程预备知识 Linux网络编程篇之TCP协议分析及聊天室功能实现 如果对Linux网络编程,对socket通信不是太清楚的同学,强烈推荐看 ...
- 应用编程与裸机编程、驱动编程的区别(Linux应用编程篇)
用嵌入式Linux硬件平台下的软件开发来说,我们大可将编程分为三种,分别为裸机编程.Linux驱动编程以及 Linux应用编程. 裸机编程: 一般把没有操作系统支持的编程环境称为裸机编程环境,譬如单片 ...
- linux tcp 服务器 c,Linux网络编程篇之Tcp协议介绍, C/S通信及聊天室实现
基于tcp协议的网络程序流程图如下: tcp协议网络程序流程图 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态 客户端调用so ...
- Linux驱动编程篇(三)——LED驱动(一)简单LED驱动
一.LED驱动程序的实现目标及流程图 1.打开LED 2.关闭LED 二.LED驱动程序的实现部分 1.内核层LED驱动程序 2.应用层LED测试程序 三.内核层LED驱动程序的编程步骤 1.添加头文 ...
- Linux系统中的文件类型(Linux应用编程篇)
windows系统下,操作系统识别文件类型一般是通过文件名后缀来判断 虽然Linux系统并不会通过后缀来识别文件,但是文件后缀也要规范.需要根据文件本身的功能属性来添加. LInux系统下一共分为 7 ...
- docker常见面试题_测试面试题集锦(四)| Linux 与 Python 编程篇(附答案)
本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群. 本系列文章总结归纳了一些软件测试工程师常见的面试题,主要来源于个人面试遇到的.网络搜集(完善).工作日常讨论等,分为以下十个部分,供大家参考.如 ...
- python中json如何存放字节数组中_测试面试题集锦(四)| Linux 与 Python 编程篇(附答案)...
本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群. 本系列文章总结归纳了一些软件测试工程师常见的面试题,主要来源于个人面试遇到的.网络搜集(完善).工作日常讨论等,分为以下十个部分,供大家参考.如 ...
- 测试面试题集锦(四)| Linux 与 Python 编程篇(附答案)
原文链接 本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群. 本系列文章总结归纳了一些软件测试工程师常见的面试题,主要来源于个人面试遇到的.网络搜集(完善).工作日常讨论等,分为以下十个部分,供大 ...
- 【Linux学习(3)】----C语言编程篇(1)
一.环境搭建: 在Linux环境下先使用: sudo apt-get update 将下载源进行更新.在更新完毕之后,再使用 sudo apt-get install gcc 将C语言的编译器进行gc ...
- Linux之shell编程篇-----Shell 函数和Shell 输入/输出重定向
最近发现了一个挺厉害的人工智能学习网站,内容通俗易懂,风趣幽默,感兴趣的可以点击此链接进行查看:床长人工智能教程 废话不多说,请看正文! Shell 函数 1. 自定义函数 linux she ...
最新文章
- 如何在父进程中读取子(外部)进程的标准输出和标准错误输出结果
- 你的房东可能正用AI筛查你的犯罪记录,决定要不要租房给你
- Android之系统自带的文字外观设置
- 运维自动化------ansible搭建
- mysql查询交叉连接_复杂的MySQL查询,联合,交叉或自然连接?
- Lambda使用——JDK8新特性
- Python 日期和时间戳的转换
- python 彻底解读多线程与多进程_python 多进程与多线程浅析
- 经典面试题(23):以下代码将输出的结果是什么?
- 26. GD32F103C8T6入门教程-CAN外设回环测试
- Java中Arrays类的两个方法:deepEquals和equals
- dwz中的table
- Matplotlib 中文用户指南 8.2 我们最喜欢的秘籍
- Matlab之共轭转置与非共轭转置
- Eclipse连接小米手机无连接显示解决办法
- 【react学习笔记】为什么页面只展示空标签
- Java毕业设计-流浪动物救助系统
- List 接口中扩充的 10 个方法详解
- Spring-拦截器与过滤器
- Java实现QQ登陆界面的搭建