
C
文章平均质量分 50
Alen.Wang
智能机器人硕士,擅长复杂电路设计、嵌入式软件编程及系统架构设计,从事嵌入式AI开发工作,有多年项目开发经验。
我的联系邮箱 alen_wp@163.com
展开
-
c语言数组下标为负数
c语言中数组的下标可以是负号,在代码运行前不会对数组是否下标越界、溢出等异常进行警告或处理,因此需人为干预。测试代码:#include<stdio.h>#include <stdlib.h>int main(int argc, char *argv[]){ int array[]={1,2,3,4,5,6}; int *p; int offset; if(argc == 2) offset = atoi(argv[1]); else off.原创 2020-07-30 09:22:18 · 3615 阅读 · 0 评论 -
linux c下,从路径名中分离文件名
首先介绍一些查找字符的函数1、strrchr头文件:#include strrchr() 函数用于查找某字符在字符串中最后一次出现的位置,其原型为: char * strrchr(const char *str, int c);【参数】str 为要查找的字符串,c 为要查找的字符。strrchr() 将会找出 str 字符串中最后一次出现的字符原创 2017-12-15 11:06:44 · 4977 阅读 · 0 评论 -
在液晶上显示数字思路,如显示123456789
//m^n函数//返回值:m^n次方.u32 LCD_Pow(u8 m,u8 n){ u32 result=1; while(n--)result*=m; return result;} //显示数字,高位为0,还是显示//x,y:起点坐标//num:数值(0~999999999); //len:长度(即要显示的位数)//void LCD_ShowCha原创 2017-10-08 18:28:06 · 9378 阅读 · 0 评论 -
在链表尾部添加数据
#include#include#include#includetypedef struct node{ int data; struct node *next; }g_tNode,*g_ptNode;static g_ptNode ptHead;void AddTailNew(int num){ g_ptNode tmp,tail; tmp = ptHead原创 2017-10-30 14:18:47 · 3392 阅读 · 0 评论 -
在液晶屏里显示浮点数的方法 (sprintf 的妙用)
思路:使用 sprintf 函数将浮点型数据转为指定格式的字符串#include #includeint main(){ unsigned char len,temp[10]; float a =1234.5689; len=sprintf((char *)temp,"%0.2f",a); printf("%d [%s]\n",len,temp); retu原创 2017-11-20 14:26:36 · 14038 阅读 · 4 评论 -
二级指针如何分配动态内存并赋值
//二级指针如何分配动态内存并赋值#include #include int main(void){ int **p = NULL; //最好是显式初始化这个二级指针 以防不测 int m, n, i, j; printf("请输入数组的行数和列数:\n例如格式:5,6 :代表5行6列\n"); scanf("%d,%d", &m, &n); p原创 2017-10-21 16:44:34 · 3335 阅读 · 0 评论 -
计算输入字符串里各个字符所占比例
#include #define MAX 100void detect(char s[]){ char ch[MAX];/*记录出现的字符*/ int num[MAX]={0};/*记录每个字符出现的次数*/ int i,j,n=0; for(i=0;s[i]!='\0';i++) { for(j=0;j<n;j++) if(s[i]==ch[j]||(原创 2017-11-23 10:22:45 · 1410 阅读 · 1 评论 -
16进制数字转换为字符
//将1个16进制数字转换为字符//hex:16进制数字,0~15;//返回值:字符u8 hex2chr(u8 hex){ if(hex<=9) return (hex+'0'); if(hex>=10&&hex<=15) return (hex-10+'A'); return '0';}原创 2017-07-16 10:46:58 · 1360 阅读 · 0 评论 -
字符转换为16进制数字
//将1个字符转换为16进制数字//chr:字符,0~9/A~F/a~F//返回值:chr对应的16进制数值u8 chr2hex(u8 chr){ if(chr>='0'&&chr<='9') return (chr-'0'); if(chr>='A'&&chr<='F') return (chr-'A'+10); if(chr>='a'&&chr<='f') retur原创 2017-07-16 10:45:22 · 2072 阅读 · 0 评论 -
if语句的陷阱
#includevoid main(){ char a=0; if(a==0) { a=1; printf("00000000\n"); } else if(a==1) { a=0; printf("11111111\n"); }}输出结果是:0000原创 2017-06-29 14:06:32 · 747 阅读 · 0 评论 -
C语言itoa()函数和atoi()函数详解(整数转字符C实现)
C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串。1.int/float to string/array:C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明。● itoa():将整型值转换为字符串。● ltoa():将长整型值转换为字符串。● ultoa()转载 2017-04-13 20:56:15 · 14668 阅读 · 1 评论 -
linux getline()函数
getline()函数是什么?百度百科这样解释: getline不是C库函数,而是C++库函数。它会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束。1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。linux标准C中使用条件:#define _GNU_SOURCE#include 函数声明:ssize_t ge原创 2017-06-16 20:47:14 · 4473 阅读 · 0 评论 -
什么是C语言结构体字节对齐,为什么要对齐?
一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取转载 2016-06-13 18:48:03 · 6495 阅读 · 0 评论 -
#pragma pack 在BITMAP结构体定义中的使用
BITMAP位图文件主要分为如下3个部分:块名称对应Windows结构体定义大小(Byte)文件信息头BITMAPFILEHEADER14位图信息头BITMAPINFOHEADER40RGB颜色阵列BYTE*由图像长宽尺寸决定定义BITMAP 文件信原创 2017-05-03 20:39:09 · 627 阅读 · 0 评论 -
select函数详解
Select函数在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、 accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻原创 2017-02-23 20:24:26 · 982 阅读 · 1 评论 -
C语言中的未初始化变量的值
C语言中未初始化的变量的值是0么全局变量 、静态变量初始值为0局部变量,自动变量初始值随机分配C语言中,定义局部变量时如果未初始化,则值是随机的,为什么?定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的。转载 2017-11-25 11:56:54 · 15716 阅读 · 2 评论 -
C语言经典面试题 与 C语言面试宝典
1 预处理问题1:什么是预编译?何时需要预编译?答:预编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作。主要处理#开头的指令。如拷贝#include包含的文件代码、替换#define定义的宏、条件编译#if等。.何时需要预编译:1、总是使用不经常改动的大型代码体。2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的转载 2017-12-22 16:15:26 · 116145 阅读 · 16 评论 -
C语言中 || 和 &&
|| 或操作,|| 为界将表达式分为两部分,他会先算前一部分,如果前一部分为真,他将停止运算,如果为假,他才会算第二部分,你这里第一部分就为真了,第二部分当然也就不会算了。例如: a || b ,只有在前一个条件a为假,才会去判断条件b ;若条件a为真,则条件b不会执行&&且操作 ,&&为界将表达式分为两部分,他会先算前一部分,如果前一部分为假,他将停止运算,如果为真,他才会算第原创 2017-12-21 21:36:05 · 66872 阅读 · 4 评论 -
值得推荐的C/C++框架和库,包含很多开源项目 (真的很强大)
值得学习的C语言开源项目-1. WebbenchWebbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。 下载链接:http://home.tiscali.cz/~cz2...转载 2019-01-16 16:18:48 · 4582 阅读 · 0 评论 -
C++ 与 C 语言 结构体初始化
C++ 总结几种结构体初始化的方法 C语言结构体初始化的四种方法 C++中的struct可以看作class,结构体也可以拥有构造函数,所以我们可以通过结构体的构造函数来初始化结构体对象。(在C++中,结构体与类在使用上已没有本质上的区别了,所以可以使用构造函数来初始化)struct JNIOR_OUTPUT { char state; long long us...原创 2018-10-24 15:52:47 · 563 阅读 · 0 评论 -
三级指针动态分配/释放内存(C / C++)
俗话说,没有对比就没有伤害。本文提供两个语言版本的三级指针分配/释放方法。C语言版本#include <stdio.h>#include <stdlib.h>#define high 2#define row 3#define col 4 int main(){ int i,j,k; // p[2][3][4] ...原创 2018-10-11 15:10:10 · 3064 阅读 · 4 评论 -
二级指针动态分配/释放内存(C / C++)
俗话说,没有对比就没有伤害。本文提供两个语言版本的二级指针分配方法。C语言版本#include <stdio.h>#include <stdlib.h>#define row 4#define col 8 int main(){ int **p; int i,j; //p[4][8] //开始分配4行8列的二维数据 ...原创 2018-10-11 15:00:01 · 14786 阅读 · 2 评论 -
数组元素为0的说明
最近在看UVC摄像头驱动,发现了这几段代码:for (j = 0; j < npackets; ++j) { urb->iso_frame_desc[j].offset = j * psize;//iso是实时的意思 urb->iso_frame_desc[j].length = psize; }跟踪iso_frame_d...原创 2018-06-08 16:10:25 · 4294 阅读 · 0 评论 -
void指针变量的用法
比如void *P=...;那么*P表示什么?warning: dereferencing 'void *' pointer [enabled by default]error: invalid use of void expressionvoid*类型定义的指针变量只接收对象的地址,没有对象的类型概念。所以该指针变量是不能直接用“*指针变量”去访问对象的,只能原创 2018-02-05 17:40:29 · 4635 阅读 · 0 评论 -
linux获取文件大小的函数fstat()
C语言fstat()函数:由文件描述词取得文件状态头文件:#include #include 定义函数:int fstat(int fildes, struct stat *buf);函数说明:fstat()用来将参数fildes 所指的文件状态, 复制到参数buf 所指的结构中(struct stat). fstat()与stat()作用完全相同,原创 2017-03-03 09:11:27 · 15728 阅读 · 0 评论 -
C语言实现Base64编码/解码
Bse64是一种以64个可打印字符对二进制数据进行编码的编码算法。base64在对数据进行编码时以三个8位字符型数据为一组,取这三个字符型数据的ASCII码,然后以6位为一组组成4个新的数据,这4个新的数据有6位,所以它的最大值为2^6=64。我们以4个6位数据的十进制数从base64表中得到最终编码后的字符。Base64 编码表Value Char Value ...原创 2017-12-18 19:10:36 · 52415 阅读 · 23 评论 -
解析命令行参数
#include #include#define CFG_MAXARGS 10//parse_line函数参考uboot源码static int parse_line (char *line, char *argv[]){ int nargs = 0; while (nargs < CFG_MAXARGS) { /* skip any white space */ w原创 2018-01-01 11:59:02 · 925 阅读 · 0 评论 -
strcpy()与strncpy()的区别
头文件:#include <string.h>strcpy() 函数用来复制字符串,其原型为:char *strcpy(char *dest, const char *src);【参数】dest 为目标字符串指针,src 为源字符串指针。注意:src 和 dest 所指的内存区域不能重叠,且dest 必须有足够的空间放置 src 所包含的字符串(包含结束符NULL)。【返回值】成功执行...原创 2017-06-16 17:37:13 · 31556 阅读 · 2 评论 -
字符串指针与字符数组的区别
字符串指针与字符数组的区别 1,数组直接储存对象,指针则是指向一个对象。2,数组名不能被赋值,指针变量能。3,sizeof一个数组,得到数组的长度(字节单位),sizeof一个指针,相当于sizeof(void*)。(注意,不同目标平台指针长度可能不同,所以sizeof(void*)是最准确的回答)4,指针是间接访问,数组是直接访问。 4.1. 在ANSI C中,原创 2016-12-10 18:11:26 · 554 阅读 · 0 评论 -
使用memcpy 复制unsigned int 型的数据
#include#includeunsigned int flash_read(unsigned int *address,unsigned int *buf,unsigned int len){ unsigned int i; if(buf==NULL) return 1; for(i=0;i<len;i++){ *buf =*address; address+=4;原创 2016-11-18 11:47:08 · 11614 阅读 · 0 评论 -
如何提高浮点数变整数的精度
在我们的产品设计中,经常会遇到浮点数变整数的时候,那么,我们首先看看,浮点数变整数的精度如何?1、分别定义一个浮点数26.6和26.4,把这个数强制转换成整数后,是多少?按理说,或者说,我们希望的结果,应该是四舍五入的27和26,但是结果是程序只取了整数部分,小数部分根本没有给我们四舍五入。2、用 modf 函数,提取浮点数的小数部分。 if 小数原创 2016-10-21 16:21:12 · 1861 阅读 · 0 评论 -
单个字符比较问题
转载请注明出处:c语言中 单个字符不能比较大小! 比如'A' 倘若要比较两个字符,必须以ASCII码的形式进行比较。unsigned char code chepai_su[]="苏A89682";for(num=2;num{test=(unsigned char)chepai_su[num]; // 将字符强制转化为ASCII码if((test>=0原创 2016-11-10 19:37:01 · 8778 阅读 · 0 评论 -
递归
什么是递归?1. 定义Wiki [1]:Recursion is the process of repeating items in a self-similar way.具体到计算机中去 [2]:递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。英文的Recursion从词源上分析只是"re- (again)" + "c原创 2016-10-13 15:25:31 · 401 阅读 · 0 评论 -
sprintf()函数的用法
函数功能:把格式化的数据写入某个字符串函数原型:int sprintf( char *buffer, const char *format [, argument] … );返回值:字符串长度(strlen)例子:char* who = "I";char* whom = "优快云";sprintf(s, "%s love %s.", who, whom); //产生:"I原创 2016-07-14 12:34:27 · 559 阅读 · 0 评论 -
整数拆分 整合算法
转载请注明出处:// 整数分解然后再整合.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"/** 第一个参数 num :要被分解的整数* 第二个参数 a[] :把整数分解后,存在这个数组里* 函数返回值 : 被拆的整数 的位数*/int myRevert(int num, int a[]) //把整数原创 2016-06-25 19:12:15 · 1444 阅读 · 0 评论 -
进制之间换算
1、16进制字符串转换成10进制long int str_dec(uchar s[]) { uchar i,m,n; long int temp=0; m=4; //十六进制是按字符串传进来的,所以要获得它的长度for(i=0;i{ if(s[i]>='A'&&s[i]n=s[i]-'A'+10;原创 2016-05-09 20:58:46 · 554 阅读 · 0 评论 -
linux下printf函数为什么不加\n就不能输出相关的内容 ?
原因: 输出缓冲区的问题.unix上标准输入输出都是带有缓存的,一般是行缓存。对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,才会把缓存的数据显示到终端设备上。ANSI C中定义换行符'\n'可以认为是行刷新标志。所以,printf函数没有带'\n'是不会自动刷新输出流,直至缓存被填满。解决方案:方案原创 2016-11-21 09:11:40 · 10608 阅读 · 0 评论 -
Ubuntu下使用gcc编译c文件,未识别cos,sin
Ubuntu下使用gcc编译c文件,虽然我调用了math.h的头文件,但是未识别cos,sin 报错:( fft.c )/tmp/ccwXjD8C.o: In function `fft':fft.c:(.text+0x17a): undefined reference to `cos'fft.c:(.text+0x188): undefined reference to `s原创 2016-12-06 21:15:12 · 2533 阅读 · 1 评论 -
指针空间的申请与释放
隐蔽的内存泄漏内存泄漏主要有以下几种情况:内存分配未成功,却使用了它。内存分配虽然成功,但是尚未初始化就引用它。内存分配成功并且已经初始化,但操作越过了内存的边界。忘记了释放内存,造成内存泄露。释放了内存却继续使用它。对动态内存的错误观念有人对某一只在函数内使用的指针动态分配了内存,用完后不释放。其理由是:函数运行结束后,函数内的所有变量全部消亡。这是错误的原创 2017-03-11 11:26:31 · 2615 阅读 · 0 评论 -
双向链表操作
#include #include #include typedef struct NAME { char *name; struct NAME *pre; struct NAME *nxt;}T_Name,*PT_Name;PT_Name ptNameHead;int ListAllName(){ PT_Name ptTemp; int i=0; if(!pt原创 2017-03-11 10:56:15 · 287 阅读 · 0 评论