
C language
HeroKern
欢迎关注嵌入式开发公众号,定期更新技术文章。
-
原创 Strtoul command
function>strtoul #include unsigned long int strtoul (const char* str, char** endptr, int base);Convert string2015-12-18 21:59:5617562
0
-
原创 C语言一些例子(九九乘法表,杨辉三角形,九宫算法)
例子、九九乘法表#includeint main(){ int i,j; for(i=1;i<=9;i++) {for(j=1;j<=i;j++)printf("%d*%d=%d ",j,i,i*j);printf("\n"); } return 0;}执行结果:1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=92016-05-29 19:42:3121466
1
-
原创 结构体指针之 段错误 详解(segmentation fault)
一个网友问了我一个问题,一个C程序运行出现了段错误,这个问题非常好,很多初学者都容易犯这个错误,具体代码如下:这个编译没有问题,但是运行是段错误 Segmentation fault因为你定义了一个结构体指针p,用来指向此类结构体,但是你却没有给他赋值,此时p的值为NULL,你并没有在内存中为p分配任何空间,所以p->a=1这句就会出段错误。修改方法1:可2016-03-05 16:41:5211220
7
-
原创 对文件操作系列函数详解
个人最文件操作做了如下的总结:方法一:用fopen打开,然后用文件那一类操作函数(fopen,fclose,fsacnf,fprintf,fseek,fread,fwirte,fgets)来改变其中的值,个人使用这些函数不太习惯。方法二:把文件映射到内存上,通过内存的一系列函数来操作,更加方便一点。fopen->fileno(把文件流转换成设备描述符)->fstat(读取文件大小)->mmap(映2016-05-17 16:00:226413
0
-
原创 open和fopen的区别
fopen,fclose,fread,fwrite,fgetc,fgets,fputc,fputs,freopen,fseek,ftell,rewind等缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装2015-12-03 14:57:2420450
0
-
原创 用C语言实现中文到unicode码的转换
由于本人喜欢用Notepad++编辑器,该编辑器的好处是小巧灵活,但是有几个地方做的不足,但是我都能够很好的采取相应的措施,下面让我们看看Notepad++有哪些地方的不做,进而采取怎样的措施。一:Notepad++不能编译16进制文件,UE可以实现;常用解决:我们常用的Beyond Compare 4(文本比较)可以轻松代替Notepad++不能看16进制的问题。二Not2015-12-22 13:33:3732686
0
-
原创 C语言之fileno()函数
open函数相关的: /* open 是系统调用 返回的是文件句柄*/#include #include #include int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);fopen函数相关的: /* open是ANSIC2016-04-05 22:28:4710573
0
-
原创 linux下如何用c语言调用shell命令
C程序调用shell脚本共有三种法子 :system()、popen()、exec系列数call_exec1.c ,system() 不用你自己去产生进程,它已经封装了,直接加入自己的命令exec 需要你自己 fork 进程,然后exec 自己的命令popen() 也可以实现执行你的命令,比system 开销小system()的使用,我直接上代码吧我在/home2016-04-02 22:36:4320354
0
-
原创 registe关键字的注意事项
关键字registe请求编译器尽可能的将变量存在CPU的寄存器中。有以下几点注意的地方。这就要求将register变量存放在机器寄存器中,这可以带来更小,更快的程序。但是,程序有权忽略这个建议。这个寄存器变量声明不仅仅可以用在自动变量上,也能用在函数的参数上。实际上,对register的使用是有限制条件的,这个体现在具体硬件上。每个函数中只有很少的变量能够存放在寄存器中,而且,只是确定的类型可以存2016-07-12 12:48:3921160
1
-
转载 BSS段、数据段、代码段、堆与栈
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。代码段:代码段(code segment/text segment)通2016-03-18 18:02:293742
0
-
原创 C语言程序的存储区域
由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-连接三个阶段。编译过程把C语言文本文件生成汇编程序,汇编过程把汇编程序形成二进制机器代码,连接过程则将各个源文件生成的二进制机器代码文件组合成一个文件。 C语言编写的程序经过编译-连接后,将形成一个统一文件,它由几个部分组成。在程序运行时又会产生其他几个部分,各个部分代表了不同的存储区域: 1.代码段(Code或Text2016-07-12 12:47:1716121
9
-
原创 快速排序C语言实现(递归)和希尔排序
快速排序:#include "stdio.h"void swap(int *a,int *b){ /*序列中元素位置的交换*/ int tmp; tmp = *a; *a = *b; *b = tmp;}void quicksort(int k[], int s,int t){2016-10-07 20:09:564229
0
-
原创 计算整数的划分可能性算法
将一个正整数N表示成一系列正整数之和。#include "stdio.h"int P(int n,int m){ if(m==1 || n == 1) return 1; if(m>n) return P(n,n); if(m==n) return 1+P(n,m-1); return P(n,m-1)+P(n-m,m);}main(){ int2016-10-23 13:17:371520
0
-
原创 斐波那契数列的应用(算法实现)
下面这个题是一个面试题,其实很简单的,就是一个斐波那契数列的应用。一个楼梯有100级,一次可以爬一级或两级,爬完100级,有几种走法?解答:如果用n表示台阶的级数,a n表示某人走到第n级台阶时,所有可能不同的走法,容易得到: ① 当 n=1时,显然只要1种跨法,即a 1=1。 ② 当 n=2时,可以一步一级跨,也可以一步跨二级上楼,因此,共有2种不同的跨法,即a 2=2。③2016-10-23 13:23:523257
0
-
原创 二维数组与指针的指针深度剖析
二位数组,数组指针,指针数组,指针的指针。这四者之间的关系希望大家看完这篇文章后在也不会分不清楚了。在C/c++中,数组和指针有着密切的关系,有很多地方说数组就是指针式错误的一种说法。这两者是不同的数据结构。其实,在C/c++中没有所谓的二维数组,书面表达就是数组的数组。我猜想是为了表述方便才叫它二维数组。以前认为二位数组是一个二级指针,现在发现理解错了,二维数组名也是个一级指针,指向一个类型并且2016-10-09 22:40:062421
0
-
原创 字符串排列组合算法
全排列所谓全排列,就是打印出字符串中所有字符的所有排列。例如输入字符串abc,则打印出 a、b、c 所能排列出来的所有字符串 abc、acb、bac、bca、cab 和 cba 。#include#includestatic int number=0;void Swap(char *a ,char *b){ char temp = *a; *a = *b; *b = temp2016-10-07 20:00:302929
0
-
原创 c语言中return,和exit的区别
exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数 tmpfile()创建的临时文件。exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,而retu2016-01-02 20:50:1815631
0
-
原创 C语言strstr()函数:返回字符串中首次出现子串的地址
头文件:#include strstr()函数用来检索子串在字符串中首次出现的位置,其原型为: char *strstr( char *str, char * substr );【参数说明】str为要检索的字符串,substr为要检索的子串。【返回值】返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL。【函数示例】strst2016-04-13 22:34:2811445
1
-
原创 sscanf command
这个网站里面包含了所以得C库,方便查找笔记,http://www.cplusplus.com/reference/cstdio/sscanf/kw=sscanffunctionsscanfint sscanf ( const char * s, const char * format, ...);Read formatted data from string2015-12-18 22:06:2014128
0
-
原创 sscanf函数用法详解
SYNOPSIS #include int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...);sscan2015-12-18 22:21:0214396
0
-
原创 C函数之memcpy()函数用法
头文件:#include memcpy() 用来复制内存,其原型为: void * memcpy ( void * dest, const void * src, size_t num );memcpy() 会复制 src 所指的内存内容的前 num 个字节到 dest 所指的内存地址上。memcpy() 并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的2016-01-22 14:03:4831358
0
-
原创 c语言程序的存储区域与const关键字的使用方法
一.C语言程序的存储区域1.由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-连接三个阶段。编译过程把C语言文本文件生成汇编程序,汇编过程把汇编程序形成二进制机器代码,连接过程则将各个源文件生成的二进制机器代码文件组合成一个文件。2.C语言编写的程序经过编译-连接后,将形成一个统一文件,它由几个部分组成。在程序运行时又会产生其他几个部分,各个部分代表了不同的2016-01-22 14:09:1834558
0
-
原创 C语言中volatile关键字的作用
一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的2016-01-22 14:13:3915171
0
-
原创 sprintf函数的用法
functionsprintfint sprintf ( char * str, const char * format, ... );Write formatted data to stringComposes a string with the same text that would be printed if format was used on p2016-01-22 18:49:2615677
0
-
原创 linux之getopt 函数
命令行参数解析函数 —— getopt()getopt()函数声明如下:#include int getopt(int argc, char * const argv[], const char *optstring);extern char *optarg;extern int optind, opterr, optopt;该函数的argc2015-12-24 14:31:5315111
0
-
原创 C 库函数和HTML标识符讲解大全
参考这个网址:http://www.cplusplus.com/reference/cstdio/sscanf/这个网址里面写得非常经典,只是是用外文写得,在这里鼓励大家不要畏惧,你要相信IT这一块老外的文章还是比较牛逼,地道!!!!!!2015-12-18 22:25:3917067
1
-
原创 C语言结构体中定义函数指针详解
在学习嵌入式我们经常和结构体函数指针打交道,还有链表,环形缓冲区之类的,这里中点讲解结构体中定义函数指针。下面这个程序你看一遍你基本也明白用法了。下面是我写的一个很简单的程序struct.c#include /* 标准输入输出头文件 */#include /* strtoul用到的头文件 */struct test_pfun2015-12-30 17:24:0935555
1
-
原创 C语言中fstat、stat和lstat 区别
在写应用程序的时候发现我们经常回去检测一个文件的大小,有了大小才能映射这个文件到内存上,方便我们直接操作。在介绍三者的区别之前,首先介绍的是一个非常重要的结构体类型,名字叫做struct stat,这是一个保存文件状态信息的结构体,其类型如下:struct stat { dev_t st_dev; /* 文件所在设备的标识 */ ino_2016-01-04 10:33:2325713
2
-
原创 linux下的stdin,stdout和stderr理解
玩linux的时候经常会看到stdin,stdout和stderr,这3个可以称为终端(Terminal)的标准输入(standard input),标准输出( standard out)和标准错误输出(standard error)。通过man stdin查看手册,可以看到它们都是在stdio.h中定义的。 当linux开始执行程序的时候,程序默认会打开这3个文件流,这样就可以对终端进行2016-01-06 17:13:2130922
4
-
原创 c语言中结构体对齐详解
为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些2016-01-12 20:02:2915128
0
-
原创 #include "*.c"文件的妙用
今天我在看代码的时候突然看到在一个.c文件中包含了#include "*.c代码,这个让我很诧异,然后google了一下,才发现是这么回事情,下面我写了一个测试代码,我相信你看完本篇文章就应该理解#include "*.c"文件的用法了。测试代码如下:main.c文件:print.c文件如下:这个两个代码必2016-03-15 15:01:247080
2
-
原创 mmap和munmap函数详解
功能描述: mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。 基于文件的映射,在mmap和munmap执行过程的任何时刻,被映射文件的st_atime可能被更新。如果st_atime字段在前述的情况下没有得到更新,首次对映射区的第一个页索引时2016-04-05 22:32:364157
0
-
原创 C语言strchr()函数
头文件:#include strchr() 用来查找某字符在字符串中首次出现的位置,其原型为: char *strchr(const char *s, int c);参数】s为要查找的字符串,c 为要查找的字符。strchr() 将会找出 str 字符串中第一次出现的字符 c 的地址,然后将该地址返回。注意:字符串 str 的结束标志 NUL 也会被纳入检索范围,所以2016-04-13 22:27:325154
0
-
原创 斐波那契数数列
在一张纸上并排画 11 个小方格。叫你的好朋友背对着你(确保你看不到他在纸上写什么),在前两个方格中随便填两个 1 到 10 之间的数。从第三个方格开始,在每个方格里填入前两个方格里的数之和。让你的朋友一直算出第 10 个方格里的数。假如你的朋友一开始填入方格的数是 7 和 3 ,那么前 10 个方格里的数应该是 7 3 10 13 23 36 ...2016-06-08 22:57:3218724
2