C语言处理字符串及内存操作
字符串处理函数
1.字符串长度 strlen表示包含的字符的个数,size_t strlen(char cosnt *string), 返回的是size_t类型,它是无符号整数类型,在表达式中进行运算时必须强制转换成整型int,因为无符号数不可能是负的,如strlen(x) - strlen(y) >=0;
2.不受限制的字符串函数,只是通过寻找字符串参数结尾的NUL字节来判断他的长度,必须保证不会溢出,strcpy和strcat返回第一个参数的拷贝,是一个指向目标字符数组的指针。
(1)复制字符串
char *strcpy(char *dst, char const *src),其中参数dst可以修改,因此它必须是字符数组或一个指向动态分配内存的数组指针,足够大,提前开辟,不能自动计算数组长度,不能是字符串常量。新字符串以NUL结尾,如果新字符串比较短,老字符串后面的几个字符也会被有效删除。
(2)连接字符串
char *strcat(char *dst, char const *src),其中dst和src的内存位置不能出现交叠,即dst和src为同一个定义的字符串,另外需要保证不会溢出。
(3)字符串比较
char *strcmp(char const *s1, char const *s2),如果s1小于s2,strcmp返回一个小于零的值,如果大于0,返回大于0的值,如果相等返回0
3.长度受限制的字符串函数
(1)char *strncpy(char *dst, char const *src, size_t len);显示接受一个长度参数,当src的字符串长度小于len,则dst用额外的NUL字节填充到len长度,如果src大于或等于len,dst的末尾不会以NUL结尾,因此考虑在函数后加一条语句:dst(sizeof(dst) - 1) = '\0';
(2)char *strncat(char *dst, char const *src, size_t len);总是在结果字符串后面添加一个NUL字节,不管dst的长度,最多往dst中复制len个字符,再加一个NUL字节。
char a[] = "ab";
char b[] = "mnp";
strncat(a, b, );
for (size_t i = ; i < ; i++)
printf("%c\n", a[i]);

总是在dst的末尾添加,不管dst的长度。
(3)char *strncmp(char const *s1, char const *s2, size_t len);函数的返回值只根据len个字节的比较来确定
4.字符串查找(重点)
(1)查找一个字符
char *strchr(char const *str, int ch);
char *strrchr(char const *str, int ch);
虽然第二个参数是整型值,但其实是一个字符值。分别返回ch在str中第一次出现和最后一次出现的位置,如果不存在则返回NULL指针。
#include <string.h>
#include <stdio.h>
int buld(char* str, char c) {
int p = strchr(str,c) - str; //???
return p;
}
int main() {
char str1[],c;
printf("输入字符串:\n");
gets(str1);
char *p = str1;
printf("输入一个字符:");
scanf("%c",&c);
printf("%s\n",strchr(str1,c));//打印字符串str1中从字符c开始的后续字符串,
//如果有字符串中有多个与c相同的字符,应该以第一个为准
int n = strchr(str1,c) - p; //???
printf("%d", n); //输出c在str1中的字符串中的位置
}
(2)查找任何几个字符(标准库中不存在)
char *strpbrk(char const *str,char const *group);
并不是查找某个特定的字符,而是查找任何一组字符第一次在字符串中出现的位置。
(3)查找一个子串(标准库中不存在)
char *strstr(char const* s1, char const* s2)
若s2不为空,在s1中查找整个s2第一次出现的位置,否则返回NULL指针;若s2为空,则返回s1
(4)查找字符串前缀
size_t strspn(char const *str, char const *group);
size_t strcspn(char const *str, char const *group);
group字符串指定一个或多个字符。strspn从str起始位置开始,遍历所有字符,直到第一个不符合group字符串的字符为止,返回所有符合group的字符的数目. strcspn则相反,直到第一个符合的字符为止,返回不符合的字符数目。
(5)查找标记
char *strtok(cahr *str, char const *sep);
sep是个字符串,定义了多个分隔符的字符集合,strtok找到str的下一个标记,并将其用NUL结尾,然后返回一个指向这个标记的指针。
典型用法:第一次调用时,向它传递一个指向字符串的指针,然后这个函数被重复调用(第一个参数为NULL),直到返回NULL,将原字符串分段输出。
#include <stdio.h>
#include <string.h> void print_tokens(char line[]){ //static char whitespace[] = " \t\f\r\v\n";
char *whitespace = " \t\f\r\v\n";
char *token; for (token = strtok(line, whitespace);
token != NULL;
token = strtok(NULL, whitespace))
printf("Next token is %s\n", token);
} int main(){ char line[] = "int main\twosshi \f\f \r\v"; print_tokens(line);
return ;
}

5.内存操作(重点)
字符串都是以NUL字节结尾,所以字符串内部不能包含NUL字符,处理类似字符串时就不能够用常规字符串处理函数,另外内存操作还可以处理数组和结构体,但该函数的返回值和参数类型均为void*
(1)void *memcpy(void *dst, void const *src, size_t length);
显式包含需要处理的字节数,但和strn的函数不同,遇到NUL并不会停止操作,可以复制任何类型的值,第三个参数指定复制长度(以字节计算)。
若是字符数组:char a[n], b[n],则memcpy(a, b, n);表示从b数组复制n个字节到a,但如果是a和b是整型数组,则memcpy(a, b, sizeof(b));
另外如果只有部分内容需要复制,则需要复制的数量需要在第三个参数中指明,对于长度大于一个字节的数据,需要数量和数据类型的长度相乘;memcpy(a, b, count*sizeof(b));
(2)void *memmove(void *dst, void const *src, size_t length);主要用于源和目标参数存在重叠的情况
(3)void *memcmp(void const*a, void const *b, size_t length);只能比较单字节的数据,一共比较length个字节,函数的返回值只根据length来确定
(4)void *memchr(void const*a, int ch, size_t length);从a开始的位置开始查找ch出现的第一次的位置,并返回一个指向该位置的指针,一共length个字节
(5)void *memset(void const*a, int ch, size_t length);从a开始的length个字节都设置为字符值ch。
注意:memset最大的作用是将a的前length个字节置为0,a可以是指针,也可以是数组。另外,由于计算机中的字节为16进制,因此不能将memset中重置为1,否则会出错。
C语言处理字符串及内存操作的更多相关文章
- R语言中字符串的拼接操作
在R语言中 paste 是一个很有用的字符串处理函数,可以连接不同类型的变量及常量. 函数paste的一般使用格式为: paste(..., sep = " ", collapse ...
- 归纳整理Linux下C语言常用的库函数----内存及字符串控制及操作
在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...
- C语言学习笔记--内存操作常见错误
1. 野指针 (1)指针变量中的值是非法的内存地址,进而形成野指针 (2)野指针不是 NULL 指针,是指向不可用内存地址的指针 (3)NULL 指针并无危害,很好判断,也很好调试 (4)C 语言中无 ...
- C#入门篇6-8:字符串操作 深入研究字符串的内存驻留机制
//字符串的内存驻留机制 public static void Test() { //当有多个字符串变量包含了同样的字符串实际值时, //CLR可能不会为它们重复地分配内存,而是让它们统统指向同一个字 ...
- C语言嵌入式系统编程修炼之三:内存操作
数据指针 在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力.在嵌入式系统的实际调试中,多借助C语言指针所具 ...
- 【C/C++】C语言嵌入式编程修炼·背景篇·软件架构篇·内存操作篇
C 语言嵌入式系统编程修炼之一:背景篇 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力.无疑,汇编语言具备这样的特质.但是,归因于汇编语言 ...
- 字符串在内存中的存储——C语言进阶
字符串是以ASCII字符NUL结尾的字符序列. ASCII字符NUL表示为\0.字符串通常存储在数组或者从堆上分配的内存中.只是,并不是全部的字符数组都是字符串,字符数组可能没有NUL字符. 字符数组 ...
- C语言字符,字符串,字节操作常用函数
strlen 这个函数是在 string.h 的头文件中定义的 它的函数原型是 size_t strlen( const char ); size_t 是一个无符号整型,是这样定义的 typedef ...
- C++_系列自学课程_第_9_课_C语言风格字符串_《C++ Primer 第四版》
前面说了写关于数组和指针的内容,这次在这里讨论一下字符串,讨论一下C语言风格的字符串. 在C语言里面我们利用字符数组来对字符串进行处理, 在C++里面我们前面说过一种类类型string可以对字符串进行 ...
随机推荐
- Spring Cloud失散多年的哥哥Dubbo学习笔记
Spring Cloud失散多年的哥哥Dubbo 随着互联网项目用户量的急剧增长,访问并发良突然暴增,将一个应用使用多个独立的工程共同实现的系统架构,称为SOA系统架构,各个工程可以允许在不同的机器上 ...
- 阿里云SaaS加速器“宜搭”发布宜搭Plus提升6倍研发效率
9月26日,在杭州云栖大会上,阿里云SaaS加速器的“底座”——“宜搭”正式发布“宜搭Plus”低代码开发平台.开发复杂企业业务系统所需要的领域数据模型.逻辑&服务编排.专业UI页面设计等,都 ...
- 巧用CSS3的calc()宽度计算做响应模式布局
今天浏览这个http://www.sitepoint.com站时,因为好奇看了下人家写的代码,结果发现了这行代码, 于是就研究了一下,calc()从字面我们可以把他理解为一个函数function.其实 ...
- duilib教程之duilib入门简明教程17.事件处理和消息响应
界面的显示方面就都讲完啦,下面来介绍下控件的响应. 前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEGIN_ME ...
- ie9 jscript7 内存不足 页面无响应
花了我差不多一天时间 我是加载一个datagrid ,多表联查,查询几遍(不一定,又是1遍就死了)后 就卡死了...后台日志都是过的.... 后来我发现数据库某个表的数据很多有一模一样的两条,把一份删 ...
- appium + python 自动化调试手机时 UiAutomator exited unexpectedly with code 0, signal null
放上appium报错图,appium在手机里安装了appium setting 和unlock 软件,输入法也被变成了appium input ,但是就是点不到目标软件,手机也可以被cmd adb ...
- 2019牛客国庆集训派对day5
2019牛客国庆集训派对day5 I.Strange Prime 题意 \(P=1e10+19\),求\(\sum x[i] mod P = 0\)的方案数,其中\(0 \leq x[i] < ...
- 12-6-上下文this
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 关于java 线程的停止同时用 interrupt 和 join 的作用
/** * @FileName: ThreadTest.java * @Description: * @Author : xingchong * @CreateTime: Sep 22, 2018 1 ...
- JavaScript特效源码(4、鼠标特效)
1.鼠标感应--渐现特效 鼠标感应渐显图片[平时很模糊的图片鼠标一放上就显示清楚] [修改图片名称即可][共2步] ====1.将以下代码加入HTML的<head></head> ...