C语言
guanjianhe
这个作者很懒,什么都没留下…
展开
-
c 语言超时溢出问题
在嵌入式开发过程中,经常会遇到溢出问题,例如在使用软定时判断时间是否超时。是一个无符号数,假如是一个无符号8位,当为254,超时时间为2个tick,则timeout为0,这时候条件成立,判断出错。原创 2023-08-28 18:43:20 · 1578 阅读 · 0 评论 -
modbus之crc16计算代码
这边提供两种方式,第1种是查表法方式,速度会快一点,但是需要多占用一些空间;第二种是纯计算方式,速度相对第一种会慢一点,但是比较省空间。原创 2022-11-14 19:07:04 · 700 阅读 · 1 评论 -
C语言利用编译器参数检查
原理sizeof(char[1])在编译阶段不会报错,而sizeof(char[-1])会报错用法#define BUILD_CHECK(condition) ((void)sizeof(char[1 - 2*(!(condition))]))struct XX{ int a; int b; int c;};int main(void){ //如果结构体不等于12个字节则在编译阶段会报错 BUILD_CHECK((sizeof(struct XX) == 12)); retu原创 2020-11-11 20:20:17 · 586 阅读 · 1 评论 -
C语言重定向输出
#include <stdio.h>#include <string.h>int main(){ fprintf(stdout, "Hello "); fprintf(stderr, "World!"); return0;}原创 2020-01-28 19:28:57 · 531 阅读 · 0 评论 -
C语言宏定义 '\'不会换行
今天发现格式化工具在格式化代码时候把下面这行#define LC_SET(s) s = __LINE__; case __LINE__:格式化成:#define LC_SET(s) \ s = __LINE__; \ case __LINE__:看到这样被吓了一跳,如果s = __LINE__; \case __LINE__:这两行不在同一个位置时候,即__LI...原创 2020-01-21 15:09:50 · 1441 阅读 · 0 评论 -
C语言获取本地时间
#include "stdio.h"#include "time.h"void put_date(const struct tm* timer){ const char* wday_name[] = {"日", "一", "二", "三", "四", "五", "六"}; printf("%4d年%02d月%02d日(周%s)%02d时%02d分%02d秒\n", ...原创 2020-01-08 21:11:32 · 423 阅读 · 0 评论 -
c语言文件读写总结
打开文件FILE *fopen(const char *filename, const char *mode)filename – 这是 C 字符串,包含了要打开的文件名称。mode – 这是 C 字符串,包含了文件访问模式,模式如下:“r”:打开一个文本文件,可以读取文件,该文件必须存在“w”:打开一个文本文件,可以写入文件,如果文件不存在则创建,存在则覆盖“a”:打开一个...原创 2019-12-30 22:11:48 · 1545 阅读 · 0 评论 -
宏定义参数
宏定义的参数以逗号(,)作为分隔符#include <stdio.h>#define FUN(AA,aa) {AA;printf("%d\n",aa);}void fun ( void )FUN ( printf ( "你好\n" ); printf ( "我好\n" ), 20 )int main ( void ){ fun(); return 0...原创 2019-03-05 08:50:55 · 2850 阅读 · 0 评论 -
数独求解
//数独求解:递归+回溯#include <stdio.h>int map[9][9];#define false 0#define true 1void display() //打印输出{ int i, j; for (i = 0; i < 9; i++) { for (j = 0; j < 9; j++) ...原创 2019-07-18 13:29:17 · 944 阅读 · 2 评论 -
c语言 重定向 流
#include <stdio.h> #include <iostream> using namespace std;int main() { int a,b; freopen("in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取 freopen("out.txt","w",stdout); //原创 2019-02-08 16:28:52 · 292 阅读 · 0 评论 -
c语言 main函数的两个参数的作用
#include <stdio.h>#include <stdlib.h>int main ( int argc, char* argv[] ){ int i; for ( i = 0; i < argc; i++ ) { printf ( "%s\n", argv[i] ); } system ( ...原创 2019-02-08 15:45:17 · 1091 阅读 · 0 评论 -
数组指针和指针数组
数组指针(也称行指针)定义: int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的二维数组,这个二维数组的长度是n,也可以说是p的步长,也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。p=a; //将该...原创 2019-07-20 17:48:02 · 108 阅读 · 0 评论 -
C语言中在常数后面加U、L、F的功能(转)
一、含义解释U:unsignedL:long / doubleF:float二、例子#define SECONDS_PER_YEAR (365*24*60*60)UL#define PI 3.1415F#define TEST_L 100000.6283L 三、例子解释1、C语言中,常数分为整型和浮点型。2、...转载 2019-08-01 12:09:08 · 13087 阅读 · 0 评论 -
指针
声明一个指针变量:type *pType = NULL;pType有5个“属性”,分别是:pType = (己址,己值,他址,他值,他型);己址:即“自己的地址”指针变量pType作为一个变量,也有自己的地址,常见的代码写法是&pType己址在一般的程序中不会被频繁地用到,如果要用的话,就涉及到“指针的指针”,这又是另外一个话题了,本文不讨论;己值:即“自己的数据值”指针...原创 2019-08-10 22:24:41 · 206 阅读 · 0 评论 -
feof()函数多输出一个字符"0xFF"原因
首先看feof()函数(准确来说是宏)的定义:#define _IOEOF 0x0010#define feof(_stream) ((_stream)->_flag & _IOEOF)原因是当文件位置指针(fp->_ptr)到了文件末尾,然后再发生读/写操作时,标志位(fp->_flag)的bit4才会被置一;然后再调用feof(),才会得到文件结束的...原创 2019-09-17 19:46:15 · 1017 阅读 · 0 评论 -
EOF和feof()区别
首先来看他们两个的定义:#define EOF (-1)#define _IOEOF 0x0010#define feof(_stream) ((_stream)->_flag & _IOEOF)EOF是不可输出字符,因此不能在屏幕上显示。由于字符的ASCII码不可能出现-1,因此EOF定义为-1是合适的。当读入的字符值等于EOF时,表示读入的已不是正常的...原创 2019-09-17 20:01:07 · 4388 阅读 · 0 评论 -
C语言调试代码时免重复输入数据
#include<stdio.h>#include<stdlib.h>int main(){ int a,b; char str[100]; //char *str; freopen("dat.dat","r",stdin); //在当前目录下新建个文件名为“dat.dat",里面存放待读入的数据 scanf("%d %d",&.原创 2017-07-31 15:59:55 · 1846 阅读 · 0 评论 -
内存首地址8字节对齐分析
typedef unsigned char uint8_t;typedef unsigned int uint32_t;static uint8_t *pucAlignedHeap;static uint8_t ucHeap[10 * 1024];pucAlignedHeap = ( uint8_t * ) ( ( ( uint32_t ) &amp;ucHeap[ 8 ] ) &am...原创 2019-01-20 18:31:08 · 5536 阅读 · 0 评论 -
指针数组和数组指针的区别
简单介绍简单地说,int *p[4]是指针数组,int(*p)[4]是指向数组的指针指针数组:是一个元素全为指针的数组 数组指针:可以理解为指针,只是这个指针类型不是int而是int[4]类型的数组int *p[4],p是一个指针数组,每一个指向一个int型的,等价于(int *) (p[4])int (*p)[4],p是一个热指针,指向int[4]的数组通过运算符优先级来理...原创 2018-08-23 11:01:23 · 1797 阅读 · 0 评论 -
大端、小端
小端就是低位字节放在内存的低地址端,高位字节放在内存的高地址端。大端就是高位字节放在内存的低地址端,低位字节放在内存的高地址端。举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:大端模式:低地址 —————–> 高地址 0x12 | 0x34 | 0x56 | 0x78小端模式:低地址 ——————> 高地址 0x78...原创 2018-08-22 23:24:07 · 5937 阅读 · 0 评论 -
桶排序
先看例子:/* 桶排序 */#include <stdio.h>#define N 10void sort(int arr[],int n){ int temp[N+1]={0}; int i,j; for(i=0;i<n;i++) { temp[arr[i]]++; } j=0; for(...原创 2018-08-22 21:34:52 · 158 阅读 · 0 评论 -
一条语句判断数x是否2的n次幂
结论:如果一个数x为2的整数倍,则x&amp;(x-1)为false,否则为真。int fun(int x){ return !(x&amp;(x-1));}原创 2018-08-22 19:11:27 · 1056 阅读 · 0 评论 -
宏定义实现 swap(x,y)
方法1:#define swap(x,y) do{x=x+y;y=x-y;x=x-y;}while(0)方法2:#define swap(x,y) do{a^=b;b^=a;a^=b;}while(0)说明: 1. a^=b;:把a^b结果赋值给a 2. b^=a;:相当于b=b^(a^b)。而b^(a^b)等于a^b^b。b^b的结果为0,因为同一个数与本身相异或...原创 2018-08-22 17:31:20 · 6015 阅读 · 0 评论 -
C语言 sscanf()和sprintf()
sscanf()#include &amp;amp;lt;stdio.h&amp;amp;gt;int main(){ char* str; // 读入字符串 sscanf(&amp;quot;12345&amp;quot;,&amp;quot;%s&amp;quot;,str); printf(&amp;quot;%s\n&amp;原创 2018-08-13 11:01:07 · 442 阅读 · 0 评论 -
C语言 宏陷阱与缺陷
1. 不能忽视宏定义中的空格#define f (x) ((x)-1) 上面的宏定义中展开后变成 (x) ((x)-1)而不是 ((x)-1)因为在f和后面的(x)之间多了一个空格!所以如果希望定义f(x)为((x)-1),必须要这样写: #define f(x) ((x)-1) 但调用宏的时候却可以有空格,即在上面完成宏定义后,f(3)和f (3)求值后...原创 2018-08-06 13:27:34 · 936 阅读 · 0 评论 -
计算字符串长度--strlen和sizeof
今天敲代码时候,要计算发送的字符串大小,如下:char *p = "hello world";int len = sizeof(p)/sizeof(char);结果,不管我怎么改变字符串长度,len都是等于4(这个值可能在不同平台和不同编译器不一样)。后来查了一下,才发现自己错了,现总结一下。1. sizeofsizeof是运算符,功能是获得保证能容纳实现所建立的最大对象...原创 2018-08-06 13:22:43 · 3886 阅读 · 2 评论 -
十进制与BCD码转换的算法
手头上在做的项目需要用到ds1302实时时钟,ds1302读出来的数据是BCD码,需要转换,写入也是。BCD码BCD是指用二进制来表示十进制数的编码,即用4位二进制来表示一位十进制数,因此4位二进制数表示最大的十进制数9(1001),只取十六个数中的十个数。比如: BCD码:0x99(153),该BCD码转换成十进制是99.算法原理十进制是逢十进一,而十六进制是逢...原创 2018-08-06 13:13:47 · 42263 阅读 · 9 评论 -
C语言 const和指针
关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。1. 修饰变量const int a = 5;int const a = 5; 上面这两种写法都一样,都是表示变量n的值不能被改变了。需要注意的地方是,用const修饰变量时,一定要给变量初始化,否则之后就不能再进行赋值了。例如下面这个例子:const int a;a = 5; ...原创 2018-08-06 12:56:00 · 4620 阅读 · 3 评论 -
冒泡排序法
/* 冒泡排序法 */#include <stdio.h>void bubblesort(int A[],int N){ char flag=1; int i,j; int temp; for(i=0;flag;i++) { flag=0; for(j=N-1;j>=i+1;j--) ...原创 2018-08-23 16:22:11 · 480 阅读 · 0 评论 -
插入排序法
/* 插入排序法 *//* 1. 将开头元素视作已排序 2. 执行下述处理,直至未排序部分消失 1. 取出未排序部分的开头元素赋给变量v 2. 在已排序部分,将所有比v大的元素向后移动一个单位 3. 将已取出的元素v插入空位*/ #include <stdio.h>void insertionsort(int A[],int N){ ...原创 2018-08-23 16:37:20 · 143 阅读 · 0 评论 -
C语言常用的库函数用法
char *strstr(const char *str1, const char *str2)判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。待续……原创 2019-01-06 16:10:59 · 374 阅读 · 0 评论 -
十六进制转字符
void Hex2Str ( unsigned char num, unsigned char str[] ){ unsigned char H, L; H = num >> 4; L = num & 0x0F; if ( H > 9 ) str[0] = 'A' + H - 10; else ...原创 2018-12-11 14:28:12 · 965 阅读 · 0 评论 -
C语言结构体4种初始化方法
struct member{ int a; float b; char *s;};/* 第一种 */struct member mem = {10,20.0f,"good"};/* 第二种 */struct member mem;mem.a = 10;mem.b = 20.0f;mem.s = "good";/* 第三种 */struct mem...原创 2018-12-04 17:35:08 · 571 阅读 · 0 评论 -
十进制转为任意位数的二进制
void func( unsigned int num, unsigned int nbit, char *str ){ unsigned int i; unsigned int j = 0; for ( i = nbit - 1; i >= 0; i-- ) { str[j++] = '0' + ( (num >> i) & 1); }}原创 2018-11-14 23:26:58 · 1713 阅读 · 0 评论 -
十六进制字符转对应的十六进制数
#include &amp;amp;lt;stdio.h&amp;amp;gt;#include &amp;amp;lt;string.h&amp;amp;gt;/* C 库函数 int feof(FILE *stream) 测试给定流 stream 的文件结束标识符。 */int main( void ){ unsigned char str[5]; unsigned char num; FILE *infp; FI原创 2018-11-11 14:57:11 · 897 阅读 · 0 评论 -
文件数据转十六进制数生成数组
#include &amp;amp;amp;lt;stdio.h&amp;amp;amp;gt;#include &amp;amp;amp;lt;string.h&amp;amp;amp;gt;/* * feof():当设置了与流关联的文件结束标识符时,该函数返回一个非零值,否则返回零。 * C 库函数 int getc(FILE *stream) 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。原创 2018-11-11 13:54:30 · 1091 阅读 · 0 评论 -
内存对齐
什么是内存对齐?先看下面的的结构体:struct TestStruct1{ char c1; short s; char c2; int i;};假设这个结构的成员在内存中是紧凑排列的,假设c1 的地址是0,那么s 的地址就应该是1,c2 的地址就是3,i 的地址就是4。也就是c1 地址为00000000, s 地址为00000001, c2地址为00000003...原创 2018-09-21 22:27:44 · 228 阅读 · 0 评论 -
检测回文数
int reverse(int n){ int reversed = 0; while(n>0) { reversed = 10 * reversed + n % 10; n /= 10; } return reversed;}int isPalindrome(int n){ return (n == reverse(n));}原创 2018-09-21 22:17:22 · 298 阅读 · 0 评论 -
& ~(sizeof(int) - 1) )详解
问题INTSIZEOF 宏,获取类型占用的空间长度,最小占用长度为int的整数倍:#define INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )引子问题1: 假设有要把一批货物放到集装箱里,货物有12件,一个箱子最多能装6件货物,求箱子的数目。解答:显然我们需要12÷6=212\div6=...原创 2018-09-25 21:44:08 · 2592 阅读 · 0 评论 -
选择排序法
/* 选择排序法 */#include &lt;stdio.h&gt;void selectionsort(int A[],int N){ int i,j,t,minj; for(i=0;i&lt;N-1;i++) { minj=i; for(j=i+1;j&lt;N;j++) { if(A[...原创 2018-08-23 16:59:38 · 772 阅读 · 0 评论