1

C语言-常用函数

C语言-常用函数

_finddata_t结构体用法

  • 功能:用来存储文件各种信息的结构体
  • 依赖:头文件<io.h>
  • 主要语法:
struct _finddata_t{
  unsigned attrib;
  time_t time_create;
  time_t time_access;
  time_t time_write;
  _fsize_t size;
  char name[_MAX_FNAME];
}
  • unsigned attrib:文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,
    主要有以下一些:_A_ARCH(存档)、 _A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。
    这些都是在中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为 1,而其他位为0)。
    既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM
  • time_t time_create: time_t是一个变量类型,实际上就是长整形变量 long int,用来保存从1970年1月1日0时0分0秒到现在时刻的秒数。
  • time_t time_access:文件最后一次被访问的时间。
  • time_t time_write:文件最后一次被修改的时间。
  • _fsize_t size:文件的大小(字节数表示)。
  • char name[_MAX_FNAME]:文件的文件名。这里的_MAX_FNAME是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。
  • 使用:需要_findfirst()_findnext()_fineclose()三个函数的搭配使用来将文件的信息存储到该结构体的内存空间。
    • long _findfirst( char *filespec, struct _finddata_t *fileinfo );
      • 返回值:
        如果查找成功的话,将返回一个long型的唯一的查找用的句柄。这个句柄将会在 _findnext函数中被使用。失败返回-1.
      • 参数:
        • filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。
        • fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体所分配的内存空间中。
    • long _findfirst( char *filespec, struct _finddata_t *fileinfo );
      • 返回值:若成功返回0,否则返回-1。
      • 参数:
        • handle:即由_findfirst函数返回回来的句柄。
        • fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。
    • int _findclose( long handle );
      • 返回值:成功返回0,失败返回-1。
      • 参数:
        • handle_findfirst函数返回回来的句柄。

该结构体和搭配的函数使用的逻辑就是先用_findfirst查找第一个文件,若成功则用返回的句柄,调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。

  • 实例:
#include <stdio.h>
//_finddata_t的使用方法
#include <io.h>
#include<Windows.h>
#include <time.h>
#include <stdint.h>
#define ADDR "F:\\text\\*txt"

const char* SearchAddr = ADDR;

typedef struct{
    uint16_t year;
    uint8_t month;
    uint8_t day;
    uint8_t hour;
    uint8_t minute;
    uint8_t second;
}bj_time;

bj_time timestamp_to_bj_time(time_t timestamp);
time_t bj_time_to_timestamp(bj_time time);

int main(){
	long handle;
	struct _finddata_t FileInfor;
	handle = _findfirst(SearchAddr, &FileInfor);
	if(handle== -1)
		return -1;
	
	while(!_findnext(handle, &FileInfor)){
		time_t timestamp;
		timestamp = FileInfor.time_create;
		printf("current timestamp: %d\n", timestamp);
    	bj_time time;
    	time = timestamp_to_bj_time(timestamp);//时间戳转为时间
		printf("file name: %s, created time: %d-%d-%d %d:%d:%d\r\n", FileInfor.name, time.year, time.month, time.day, time.hour, time.minute, time.second);
		
		timestamp = bj_time_to_timestamp(time);//时间转为时间戳
    	printf("time2 timestamp: %d\r\n", timestamp);
	}
	_findclose(handle);
	system("pause");
	return 0;
	
	
}

bj_time timestamp_to_bj_time(time_t timestamp)
{
    bj_time time;
    struct tm *t;
    t = localtime(&timestamp);
    
    /* 日期修正 */
    time.year = t->tm_year + 1900;
    time.month = t->tm_mon + 1;
    time.day = t->tm_mday;
    time.hour = t->tm_hour;
    time.minute = t->tm_min;
    time.second = t->tm_sec;
    return time;
}

time_t bj_time_to_timestamp(bj_time time)
{
    struct tm t;
    time_t timestamp = 0;
    
    /* 日期修正 */
    t.tm_year = time.year - 1900;
    t.tm_mon = time.month - 1;
    t.tm_mday = time.day;
    t.tm_hour = time.hour;
    t.tm_min = time.minute;
    t.tm_sec = time.second;
    //timestamp = mktime(&t) - 8*60*60;
    timestamp = mktime(&t);
    return timestamp;
}

结果显示:

备注:
参考1:https://blog.csdn.net/wangqingchuan92/article/details/77979669
参考2:https://blog.csdn.net/qq_36347513/article/details/118333782

memset

  • 主要语法:void *memset(void *str, int c, size_t n)
  • 功能:复制字符c(一个无符号字符)到参数str指向的字符串的前n个字符。
  • 依赖:头文件string.h
  • 参数:
    • str -- 指向要填充的内存块。
    • c -- 要被设置的值。该值以int形式传递,但是函数在填充内存块时使用无符号字符形式。
    • n --要被设置为该值的字符数。
  • 返回值:
    返回一个指向存储区str的指针.
  • 实例:
#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str[50];
   strcpy(str,"This is string.h library function");//将后面字符串复制到str
   puts(str);//把一个字符串写入到标准输入输出stdout,直到空字符,但不包含空字符。换行符会被追加到输出中
   memset(str,'$',7);//复制7个'$'到str
   puts(str);//打印str
   return(0);
}

结果显示:

strcat_s函数

  • 主要语法:errno_t strcat_s(char *strDestination , size_t numberOfElements , const char *strSource );
  • 功能:strcat_s函数与strcat函数一样,主要用于字符串拼接。
  • 依赖:头文件string.h
  • 描述:用于对字符串进行拼接, 将两个字符串连接再一起
  • 参数:
    • strDestination:目标字符串
    • numberOfElements:拼接后的字符串大小(并非目标字符串大小也并非原始字符串大小)
    • strSource:需要追加的字符串
  • 返回值:
    errno_t是微软新定义的一种类型,这种类型是一种整型,代表错误代码,若果是0 则代表没有错误,如果是其他的值 ,则会抛出一个值;
  • 实例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
	char src[1000] = {"world."};
	char dst[] = {"hello,"};
	
	int len = strlen(src) + strlen(dst) + 1;
	printf("strcat_s之前 dst:%s\n", dst);
	strcat_s(dst, len, src);
	printf("strcat_s之后 dst:%s\n",dst);
	system("pause");
	return 0;
}

结果显示:

strcpy函数

  • 主要语法:char *strcpy(char *dest, const char *src)
  • 功能:把src所指向的字符串复制到dest
  • 依赖:头文件string.h
  • 参数:
    • dest -- 指向用于存储复制内容的目标数组。
    • src -- 要复制的字符串。
  • 返回值:
    该函数返回一个指向最终的目标字符串dest的指针。
  • 实例:
# include <stdio.h>
# include <string.h>
int main(){
	char src[40];
	char dst[100];
	memset(dst, '\0', sizeof(dst));
	strcpy(src, "This is strcpy function");
	strcpy(dst, src);
	printf("最终的目标字符串:%s\n", dst);
	return 0;
	
}

结果显示:

strtok函数

  • 主要语法:char *strtok(char *str, const char *delim)
  • 功能:分解字符串 str 为一组字符串,delim 为分隔符。
  • 依赖:头文件string.h
  • 参数:
    • str -- 要被分解成一组小字符串的字符串
    • delim -- 包含分隔符的 C字符串
  • 返回值:
    该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。
  • 实例:
#include <stdio.h>
#include <string.h>

int main(){
	char str[100] = "hello-world";
	const char s[2] = "-";
	char *token;
	token = strtok(str, s);//获取第一个子字符串
	printf("1:%s\n",token);
	/*继续获取其他的子字符串*/
	while(token != NULL){
		printf("2:%s\n", token);
		token = strtok(NULL, s);
	}
	return 0;
}

结果:

说明:分解字符串为一组标记串,str为要分解的字符串,s为分隔符字符串。首次调用时,str必须指向要分解的字符串,随后调用要把str设成NULLstrtokstr中查找包含在delim中的字符并用NULL('\0')
替换,直到找遍整个字符串。返回指向下一个标记串,当没有标记串时则返回空字符NULL

memcpy函数

  • 主要语法:void *memcpy(void *str1, const void *str2, size_t n)
  • 功能:从存储区str2复制n个字节到存储区str1
  • 依赖:头文件string.h
  • 参数:
    • str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
    • str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
    • n -- 要被复制的字节数。
  • 返回值:
    该函数返回一个指向目标存储区 str1 的指针。
  • 实例:
#include <stdio.h>
#include<string.h>
 
int main()
 
{
  char *s="http://www.runoob.com";
  char d[20];
  memcpy(d, s+11, 6);// 从第 11 个字符(r)开始复制,连续复制 6 个字符(runoob)
  // 或者 memcpy(d, s+11*sizeof(char), 6*sizeof(char));
  d[6]='\0';
  printf("%s\n", d);
  printf("the 11th chars: %s", s + 11);//字符串截断,可以用这种方式
  return 0;
}

结果:

posted @ 2023-10-18 20:26  Bonne_chance  阅读(25)  评论(0编辑  收藏  举报
1