字符串(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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栋哥爱做饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值