cxx笔记06-c函数
字符串
strchr
在字符串 s 中查找字符 c 出现的位置
char *strchr(const char *str, int c)
参数
s:字符串首地址
c:匹配字母(字符)
返回值
成功:返回第一次出现的 c 地址
失败:NUL
strstr
在字符串 haystack 中查找字符串 needle 出现的位置
char *strstr(const char *haystack, const char *needle)
参数
haystack:源字符串首地址
needle:匹配字符串首地址
返回值
成功:返回第一次出现的 needle 地址
失败:NULL
strcmp
比较两个字符串,头文件<string.h>
int strcmp(const char *string1,const char *string2);
返回值:
- 第一个字符串大于第二个字符串,则返回大于0的数
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数
一般大家都会对strcmp函数产生误区,以为strcmp是比较两个字符串的长度,其实不是,strcmp是比较字符串对应位置上的字符大小(ascii码值大小),如果相同,就比较下一对,直到不同或者都遇到'\0'。
strncmp
strcat
strncat
strtok
将字符串分割成一个个片段。当 strtok()在参数 s 的字符串中发现参数 delim 中包含 的分割字符时, 则会将该字符改为\0 字符,当连续出现多个时只替换第一个为\0。代码如下,
char *strtok(char s[], const char *delim);
参数
str:指向欲分割的字符串
delim:为分割字符串中包含的所有字符
返回值
成功:分割后字符串首地址
失败:NULL
第一次调用时:strtok()必需给予参数 s 字符串
之后的调用则将参数 s 设置成 NULL,每次调用成功则返回指向被分割出片 段的指针
strcpy
strcpy()函数:是将一个字符串复制到另一块空间地址中 的函数,‘\0’是停止拷贝的终止条件,同时也会将 '\0' 也复制到目标空间。下面是库中的strcpy()函数声明:
char* strcpy(char* destination,const char* source);
-
函数的参数:
char* destination---------目标字符串的首地址
const char* source------源地址:被复制的字符串的首地址,用const修饰,避免修改掉被拷贝的字符串 -
函数的返回值类型:
char*:返回的是目标字符串的首地址
例子:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[10] = "**********";
char arr2[10] = "abcd";
printf("%s\n", strcpy(arr1, arr2)); //输出为abcd
return 0;
}
strcpy注意:
- 源字符必须以 '\0'结束
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[10] = "**********";
char arr2[] = { 'a','b','c','d' };
printf("%s\n", strcpy(arr1,arr2));
return 0;
}
这里的代码会出错,'\0'是停止拷贝的终止条件,arr2字符数组所在的内存空间后面存储的内容并不知道,不遇到 '\0' 拷贝就不会停止,这就会导致越界访问,程序就会出现问题。
- 目标空间必须足够大,以确保能放源字符串
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[5] = "*****";
char arr2[] = "hello world";
printf("%s\n", strcpy(arr1,arr2));
return 0;
}
这里虽然拷贝成功并将结果输出了,但程序却崩溃了。目标空间太小,不足以放置拷贝的源字符串,会造成溢出的情况
- 目标空间必须可变
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
const char* str1 = "hello world";
char str2[10] = "*********";
printf("%s\n", strcpy(str1,str2));
return 0;
}
这里的程序也出现了错误。str1指向的是常量字符串,是不可以被修改掉的,目标空间必须是可以被修改的,因为要将拷贝的字符串放在目标空间中。而源字符串可以是能够修改的、也可以是不能修改的,因为strcpy函数的第二个参数已经用const关键字修饰了,保证了拷贝过程中不会被修改
strncpy
puts
标准设备输出 s 字符串,在输出完成后自动输出一个’\n’。
int puts(const char *s);
参数
s:字符串首地址
返回值
成功:非负数
失败:-1
fputs
将str所指定的字符串写入到 stream 指定的文件中, 字符串结束符 ‘\0’ 不写入文件。
int fputs(const char * str, FILE * stream);
参数
str:字符串
stream:文件指针,如果把字符串输出到屏幕,固定写为 stdout。
返回值
成功:0
失败:-1
注意:fputs()是 puts()的文件操作版本,但 fputs()不会自动输出一个’\n’。fputs()需要第二个参数来说明要写的文件,与puts()不同,fputs()不为输出自动添加换行符与fgets()一起使用
内存操作
memset
C 库函数memset 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
void *memset(void *str, int c, size_t n)
参数:
str -- 指向要填充的内存块。
c -- 要被设置的值。该值以 int
形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
n -- 要被设置为该值的字节数。
返回值:
该值返回一个指向存储区 str 的指针。
memcpy
C 库函数memcpy从存储区 str2 复制 n 个字节到存储区 str1。
void *memcpy(void *str1, const void *str2, size_t n)
malloc
malloc需要显式地指出所需内存大小,分配内存失败时返回NULL,而new关键字不会返回null会抛出bac_alloc异常。malloc分本返回的是void*需要显示转换。
int *a = malloc(sizeof(int));
if(NULL == a)
{
//习惯在malloc分配内存后判断是否成功.
}
//c++使用
try{
int *a = new int();
}catch(bad_alloc)
{
...
}
malloc不会调用对像的构造函数的析构函数。
calloc
calloc函数也是与free()函数配套使用的,使用方式与malloc几乎相同,也是在堆区申请动态内存空间。头文件:stdlib.h,返回类型为空指针,size_t num为元素个数,size_t size为每个元素的字节大小。
void* calloc(size_t num ,size_t size)
calloc与malloc的区别
- 参数的使用方式不同
malloc(单位:字节):malloc(10 * sizeof(int));或malloc(40)
calloc:calloc(10 , sizeof(int)) - malloc的使用效率较高,因为calloc在返回在堆区申请的那块动态内存的起始地址之前,会将每个字节都初始化为0
realloc
在使用malloc分配内存后发现内存不足,可以使用realloc函数进行内存重新分配实现内存的扩充.realloc先判断当前的指针所指内存是否有足够的连续空间,如果有,原地扩大可分配的内存地址,并且返回原来的地址指针;如果空间不够,先按照新指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来的内存区域。
free
释放使用malloc创建的内存空间。
free()
文件操作
fstat
获取有关文件的。
int fstat(int fildes, struct stat *buf);
stat文件信息结构:
struct stat {
dev_t st_dev; /* device */
ino_t st_ino; /* inode */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device type (if inode device) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具