Linux C编程学习6---字符串处理、数据转换
1.字符串
应用程序按其功能可分为数值计算、非数值计算以及输入输出操作等。非数值计算程序占相当大的比例,其核心就是字符串处理
1.1.字符测试
1.1.1.测试字符是否为英文字母
int isalpha(int c)。若c为英文字母,则返回非零值,否则返回值为0
1.1.2.测试字符是否为数字
int isdigit(int c)。若c为数字,则返回非零值,否则返回值为0
1.2.字符串初始化
在C语言中,字符串被当做字符数组来处理,对应于内存中的一块连续的区域
可以使用 void *memset(void *buffer, int c, int count)来对这块连续的内存初始化
buffer是指针,指向我们要初始化的连续内存的首地址
参数c,是用来说明将这块内存都初始化为哪个字符,若c为0的话,就是将这块内存清零
参数count,设置的内存的字节数
例子
- #include<stdio.h>
- #include<string.h>
- int main()
- {
- char s[]="hello world";
- printf("%s\n", s);
- memset(s, 'H', 5);
- printf("%s\n", s);
- return 0;
- }
输出结果是:
hello world
HHHHH world
1.3.字符串的复制
1.3.1. char *strcpy(char *dest, char *src)
将src指向的字符串,复制给dest所指向的内存。
注意:这两个参数所指向的内存区域是不允许重叠的
函数的返回值是指向 dest的指针
1.3.2. char *strdup(char *s)
函数的返回值是指向被复制的字符串的指针,所指向的内存区域是系统自动分配的
1.3.3. void *memcpy(void *dest, void *src, unsigned int count)
将参数src所指向的内存区域复制count个字节到dest所指向的内存区域
这两个指针所指向的内存区域也是不可以重叠的
函数的返回值是指向 dest的指针
和strcpy 的不同之处在于:memcpy给源内存和目标内存的指针之后,复制指定大小(unsigned int count)的内存,而不检查内存中的具体内容,包括字符串的结束符,而前面的strcpy 函数是一旦遇到字符串的结束符则立即停止复制
所以 memcpy并没有将参数当做字符串来看待
1.3.4. void *memmove(void *dest, const void *src, size_t n)
将参数src所指向的内存区域复制n 个字节到dest所指向的内存区域
和strcpy、memcpy不同的是这两个指针所指向的内存区域是可以重叠的
例子
- #include<stdio.h>
- #include<string.h>
- int main()
- {
- char s[] = "Linux C Programming";
- printf("%s\n", s);
- memmove(s, s+6, strlen(s)-6);
- s[strlen(s)-6] = '\0';
- printf("%s\n", s);
- return 0;
- }
输出结果是
Linux C Programming
C Programming
1.4.字符串的比较
1.4.1. int strcmp(const char *s1, const char *s2)
比较参数s1 和 s2所指向的字符串,比较的依据是字符的ASCII码的值,首先将s1的第一个字符减去s2 的第一个字符,如果相同则继续比较第二个字符,如此往后比较。如果字符串相同,则返回值为0,如果不相同,则返回不相同出的字符的ASCII码的差值
1.4.2. int strncmp(const char *s1, const char * s2, size_t n)
比较s1 和s2 所指向的字符串的前 n个字节
1.4.3. int strcasecmp(const char *s1, const char *s2)
类似于 strcmp,但是在比较的过程中是忽略大小写的
1.4.4. int strncasecmp(const char *s1, const char *s2, size_t n);
类似于 strncmp,但是在比较的过程中是忽略大小写的
1.4.5. int memcmp(const void *s1, const void *s2, size_t n)
比较s1 和s2 所指向的内存空间的前 n个字节,但是它在比较时候,并不是将 s1 和s2 当做字符串的,并不会考虑内存区域中的字符串结束符
1.5.字符/字符串查找
1.5.1. char *index(const char *s, int c)
在参数s1 做指向的字符串中,从前往后查找字符c,如果找到c 第一次出现的位置,就返回指向这个位置的指针,如果找不到这个字符,就返回 null
例子
- #include<stdio.h>
- #include<string.h>
- int main()
- {
- char s[] = "hello world";
- char *p;
- p = index(s, 'w');
- printf("%s\n", p);
- return 0;
- }
输出结果是
world
1.5.2. char *rindex(const char *s, int c)
和 index 类似,不过是从后往前查找
1.5.3. char *strchr(const char *s, int c)
和 index 类似,但是不能查找 '\0'这个字符。可以用 index(s, '\0')的形式,但是不能用 strchr(s, '\0')
1.5.4. char strrctr(const char *s, int c)
和 rindex 类似,但是不能查找 '\0'这个字符。可以用 rindex(s, '\0')的形式,但是不能用 strrchr(s, '\0')
1.5.5. char *strstr(const char *haystack, const char *needle)
在字符串haystack中查找字符串needle,并返回第一次出现的位置,如果没有找到就返回一个空指针
1.6.字符串连接分割
1.6.1. char *strcat(char *dest, const char *src)
将 src所指向的字符串连接到 dest所指向的字符串,返回目标指针的起始地址
注意,目标字符串必须有足够的缓冲区,否则会发生溢出
例子
- #include<stdio.h>
- #include<string.h>
- #define BUFFER_SIZE 64
- int main()
- {
- char s[BUFFER_SIZE] = "orld;
- char d[BUFFER_SIZE] = "hello w";
- strcat(d, s);
- printf("%s\n", s);
- printf("%s\n", d);
- return 0;
- }
输出结果是
orld
hello world
1.6.2. char *strncat(char *dest, const char *src, size_t n)
从src 取出n 个字节,连接到dest 所指向的字符串。
如果src的前n 个字节中没有出现'\0',那么会在结尾处自动添加一个'\0'
1.6.3. char *strtok(char *str, const char *delim)
将 str字符串使用 delim这个分割符号来进行分割。如果在字符串str 找到任何一个分隔符则将其更改为字符串的结束符
例子
- #include<strio.h>
- #include<string.h>
- int main()
- {
- char str[] = "Linux C Programming";
- char *p;
- p = strtok(str, " ");
- while(p != NULL)
- {
- printf("%s\n", p);
- p = strtok(NULL, " ");
- }
- printf("str : "%s\n", str);
- return 0;
- }
输出结果是
C
Programming
str : Linux
2.数据转换
数据转换包括英文字母大小写之间的转换、字符串与整数、浮点数之间的转换
2.1.字母大小写转换
int toupper(int c) 将小写英文字母转换为大写,如果 c是小写字母则返回对应的大写字母,否则返回原来的值
int tolower(int c) 将大写英文字母转换为小写,原理类似上面的那个
2.2.字符串转换
实现字符串与整数、浮点数之间转换
2.2.1. 将字符串转换为整数
int atoi(const char *nptr)
long atol(const char * nptr)
这两个函数首先对字符串进行扫描,直到出现数字或者正负号才开始转换,然后再出现非数字或者字符串结束符就停止转换并将结果返回
只能转换10进制的字符串
例子
- #include<stdio.h>
- #include<string.h>
- int main()
- {
- char a[] = "-100";
- char b[] = "0x20";
- int c;
- c = atoi(a) + atoi(b);
- printf("c = %d\n", c);
- return 0;
- }
输出结果是
-100
因为,将a转换为 -100,而b是0x20,转换时,先将0转换为0,遇到x就停止转换
2.2.2. 将字符串转换为浮点数
double atof(const char *nptr)
函数首先对字符串进行扫描,直到出现数字或者正负号才开始转换,然后再出现非数字或者字符串结束符就停止转换并将结果返回
这个函数中,字符串可以包含+、-、小数点、E、e(E、e表示浮点数的指数部分)
2.2.3. 将浮点数转换为字符串
char *gcvt(double number, size_t ndigits, char *buf)
第一个参数是要转换的浮点数
第二个参数是要显示的位数
第三个参数是用来存放最终结果的一个缓冲区
Linux C编程学习6---字符串处理、数据转换的更多相关文章
- Linux 系统编程 学习:07-基于socket的网络编程2:基于 UDP 的通信
Linux 系统编程 学习:07-基于socket的网络编程2:基于 UDP 的通信 背景 上一讲我们介绍了网络编程的一些概念.socket的网络编程的有关概念 这一讲我们来看UDP 通信. 知识 U ...
- Linux 系统编程 学习 总结
背景 整理了Liunx 关于 进程间通信的 很常见的知识. 目录 与 说明 Linux 系统编程 学习:000-有关概念 介绍了有关的基础概念,为以后的学习打下基础. Linux 系统编程 学习:00 ...
- Linux 系统编程 学习:00-有关概念
Linux 系统编程 学习:00-有关概念 背景 系统编程其实就是利用系统中被支持的调度API进行开发的一个过程. 从这一讲开始,我们来介绍有关Linux 系统编程的学习. 知识 在进行Linux系统 ...
- Linux 系统编程 学习:01-进程的有关概念 与 创建、回收
Linux 系统编程 学习:01-进程的有关概念 与 创建.回收 背景 上一讲介绍了有关系统编程的概念.这一讲,我们针对 进程 开展学习. 概念 进程的身份证(PID) 每一个进程都有一个唯一的身份证 ...
- Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道
Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道 背景 上一讲我们介绍了创建子进程的方式.我们都知道,创建子进程是为了与父进程协作(或者是为了执行新的程序,参考 Linux ...
- Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号
Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...
- Linux 系统编程 学习:04-进程间通信2:System V IPC(1)
Linux 系统编程 学习:04-进程间通信2:System V IPC(1) 背景 上一讲 进程间通信:Unix IPC-信号中,我们介绍了Unix IPC中有关信号的概念,以及如何使用. IPC的 ...
- Linux 系统编程 学习:05-进程间通信2:System V IPC(2)
Linux 系统编程 学习:05-进程间通信2:System V IPC(2) 背景 上一讲 进程间通信:System V IPC(1)中,我们介绍了System IPC中有关消息队列.共享内存的概念 ...
- Linux 系统编程 学习:06-基于socket的网络编程1:有关概念
Linux 系统编程 学习:006-基于socket的网络编程1:有关概念 背景 上一讲 进程间通信:System V IPC(2)中,我们介绍了System IPC中关于信号量的概念,以及如何使用. ...
- Linux 系统编程 学习:09-线程:线程的创建、回收与取消
Linux 系统编程 学习:09-线程:线程的创建.回收与取消 背景 我们在此之前完成了 有关进程的学习.从这一讲开始我们学习线程. 完全的开发可以参考:<多线程编程指南> 在Linux ...
随机推荐
- python_九九乘法表
# 九九乘法表 print(" 九九乘法表") for table_x in range(1,10): for table_y in range(1,table_x +1): pr ...
- C#可用的日出日落时间类
一个现成代码的公共类库,复制下来作为一个类文件就可以调用了.一般不需要了解实现过程,各种数学公式太麻烦. 调用方法: SunTimeResult result = SunTimes.GetSunTim ...
- ecshop随机分类
$get_categories_tree = get_categories_tree(); $smarty->assign('category_1', RandArray($get_catego ...
- mysql二级索引
以InnoDB来说,每个InnoDB表具有一个特殊的索引称为聚集索引.如果您的表上定义有主键,该主键索引是聚集索引.如果你不定义为您的表的主键 时,MySQL取第一个唯一索引(unique)而且只含非 ...
- spring jdbc获取插入记录的主键id
在JDBC3.0规范中,当新增记录时,允许将数据库自动产生的主键值绑定到Statement或PreparedStatement中.使用Statement时,可以通过以下方法绑定主键值: int exe ...
- 【12-26】go.js
var $ = go.GraphObject.make; // for conciseness in defining templates function buildAlarm(row,column ...
- JS学习笔记(不断更新)
1 基础知识 为什么学习 JavaScript? JavaScript web 开发人员必须学习的 门语言中的一门: HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 网页的 ...
- yii2 解决POST 400错误
第一种解决办法是关闭Csrf public function init(){ $this->enableCsrfValidation = false; } 第二种解决办法是在form表单中加入隐 ...
- WCF技术内幕 第二章 - 简单的Message
1.契约 - 接口 (客户端和服务端都要认识Message) namespace WCFService { [ServiceContract(Namespace = "http://wint ...
- 【bzoj2073】[POI2004]PRZ
题目描述 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时只能分批 ...