C语言学习记录本
发布日期:2022-02-10 11:37:00 浏览次数:44 分类:技术文章

本文共 2318 字,大约阅读时间需要 7 分钟。

1.使用memcpy_s()代替memcpy()

memcpy_s(void *dest, size_t destMaxLen, const void *src, size_t count);

// destMaxLen表示目标地址的字符个数,目标缓冲区长度,可以用sizeof获取

// count表示需要拷贝的字符串长度,可以用sizeof获取

void *memcpy(void *str1, const void *str2, size_t n);

 

2.字符串长度

int length = strlen(chars);

int strlen(char *s);

 

3.const int*  /  int* const / int const*区别

①const int*

int y = 1;

const int *a = y;// 声明一个指向常量的指针a,不能用*a来修改y的值

该声明指出,a指向一个const int,这里为1,因此不能使用a来修改这个值。换句话说,*a的值为const,不能被修改,但是a的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对a而言,这个值是常量。a指向y,而y不是const,可以通过y变量来修改y的值,但不能使用a指针来修改。

②int const*

int const* 与 const int*没有区别

③int* const

int i1=30;

int i2=40;

int* const p=&i1;

//p=&i2;  错误的。p不能再指向另一个新地址了。

i1=80;  //这里能用*p=80来代替,即可以通过*p修改i1的值

printf("%d",*p);

分析:此时p的值不能被赋值修改了,只能永远指向初始化时候的内存地址。并且可用*p修改i1的值了。

 

4. memset_s

memset_s(void * dest,rsize_t destsz,int ch,rsize_t count);

destsz 目标字符串的大小,ch 要填充的字节,count 要填充的字节数;

示例:

char str[] = "asdfvgghhnn";

memset_s(str, sizeof(str), 'a', 5); //str变为“aaaaagghhnn”

 

5. scanf_s (“%s”, buffer, length);

比scanf安全,添加了边界检查,length指定了读取的长度

 

6.C语言定义结构体

//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c

//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
struct 
{
    int a;
    char b;
    double c;
} s1;
 
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//结构体的标签被命名为SIMPLE,没有声明变量
struct SIMPLE
{
    int a;
    char b;
    double c;
};
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
 
//也可以用typedef创建新类型
typedef struct
{
    int a;
    char b;
    double c; 
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;

 

7.C语言使用哈希表

C语言中使用哈希表,定义结构体

struct hashTable {

    int key;

int val;

/* 使用uthash代码时只需要包含头文件"uthash.h"即可 */

    UT_hash_handle hh;

};

/* 初始化键值对数量为空的哈希表 */

struct hashTable* hashtable = NULL;

 

/* 查找,找不到tmp为NULL,找到则tmp指向一个键值对 */

HASH_FIND_INT(hashtable, &ikey, tmp);

 

/* 插入新的键值对 */

HASH_ADD_INT(hashtable, key, tmp);

 

8. scanf()与gets()

①scanf()所在头文件:stdio.h

语法:scanf(“格式控制字符串”,变量地址列表);

接受字符串时:scanf(“%s”,字符数组名或指针);

②gets()所在头文件:stdio.h

语法:gets(字符数组名或指针);

两者在接受字符串时不同点:

scanf不能接受空格、制表符Tab、回车等;

而gets能够接受空格、制表符Tab和回车等;

scanf:当遇到回车,空格和tab键会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中

gets:可接受回车键之前输入的所有字符,并用’\0’替代 ‘\n’,回车键不会留在输入缓冲区中

举例:从键盘输入字符串 asd df时,遇到空格,scanf()就认为输入结束了,所以a中存放的字符串是 ‘asd\0’。从键盘输入字符串 asd df时,gets()遇到’\n’才认为是结束输入了,所以a中存放的是’asd df\0’。

 

9. printf()和puts()的区别

①相同点:两者都属于stdio.h这个头文件,都能输出字符串

②不同点:puts()在输出字符串时会将’\0’自动转换成’\n’进行输出,也就是说,puts方法输出完字符串后会自动换行。

 

 

----

不断更新中……

----

转载地址:https://blog.csdn.net/Fan_z_0802/article/details/109105223 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:IReport报错:Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser
下一篇:算法学习(1)--时间复杂度和空间复杂度

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年03月15日 13时46分49秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java 使用或覆盖了已过时的api_JAVA使用或覆盖了已过时的 API 2019-04-21
java 图片旋转保存_Java 对图片90度旋转 2019-04-21
用java实现文学研究助手_数据结构文学研究助手 C语言代码实现(带源码+解析)... 2019-04-21
java gc的几种方式_GC 的三种基本实现方式 2019-04-21
wget linux java 32_通过wget在Linux上下载Java JDK会显示在许可证页面上 2019-04-21
babylonjs 设置面板位置_babylonjs 空间坐标转为屏幕坐标 2019-04-21
oracle里面如何查询sqlid,CSS_oracle中如何查看sql, --查询表状态:  select uo.O - phpStudy... 2019-04-21
oracle 查询中用case,oracle case when 在查询时候的用法。 2019-04-21
oracle正在运行的程序包,ORACLE PL/SQL编程详解之程序包的创建与应用 2019-04-21
php局部页面滚动,在访问另一页面后保留浏览器滚动位置 - php 2019-04-21
jmeter运行linux命令行,Jmeter在linux上运行(命令行运行Jmeter) 2019-04-21
linux服务器怎么添加站点,如何增加站点或虚拟主机及文件说明 2019-04-21
linux系统输入指令,Linux系统基础 - 基本操作命令 2019-04-21
linux设备管理命令,Linux命令(设备管理).doc 2019-04-21
linux 中文utf-8转gbk编码,Linux平台下 GBK编码转UTF-8编码 2019-04-21
linux安装软件在boot,在Linux系统上安装Spring boot应用的教程详解 2019-04-21
linux进入用户user1主目录,Linux系统命令提示符为[user1@localhost root]当前用户所在目录为( )... 2019-04-21
取消linux自动登录,linuxdeepin 如何取消自动登录啊? 2019-04-21
linux线程存储,Linux系统编程手册:线程:线程安全和每线程存储 2019-04-21
linux以root账号登陆gnome,CentOS 7 - 以root身份登入Gnome 2019-04-21