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);
  1. 函数的参数:
    char* destination---------目标字符串的首地址
    const char* source------源地址:被复制的字符串的首地址,用const修饰,避免修改掉被拷贝的字符串

  2. 函数的返回值类型:
    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注意:

  1. 源字符必须以 '\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' 拷贝就不会停止,这就会导致越界访问,程序就会出现问题。

  1. 目标空间必须足够大,以确保能放源字符串
#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;
}

这里虽然拷贝成功并将结果输出了,但程序却崩溃了。目标空间太小,不足以放置拷贝的源字符串,会造成溢出的情况

  1. 目标空间必须可变
#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的区别

  1. 参数的使用方式不同
    malloc(单位:字节):malloc(10 * sizeof(int));或malloc(40)
    calloc:calloc(10 , sizeof(int))
  2. 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 */  
};

输入输出操作

sprintf_s

fprintf

printf

printf_s

验证函数

std::isnan - C++中文 - API参考文档 (apiref.com)

posted @ 2024-06-30 17:23  alvinlyb  阅读(0)  评论(0编辑  收藏  举报