admin 管理员组

文章数量: 887021


2023年12月23日发(作者:类似mydockfinder)

函数原形的头文件读者可参考返回非整型值的函数assert.h-assert(),声明宏ctype.h–字符类型函数float.h–浮点数原形limits.h–数据类型的大小和范围math.h–浮点运算函数stdarg.h–变量参数表.stddef.h–标准定义stdio.h–标准输入输出IO函数stdlib.h–包含内存分配函数的标准库string.h–字符串处理函数3字符类型库下列函数按照输入的ACSII字符集字符分类使用这些函数之前应当用"#include"包含intisalnum(intc)如果c是数字或字母返回非零数值否则返回零intisalpha(intc)如果c是字母返回非零数值否则返回零intiscntrl(intc)如果c是控制字符如FF,BELL,LF..等返回非零数值否则返回零intisdigit(intc)如果c是数字返回非零数值否则返回零intisgraph(intc)如果c是一个可打印字符而非空格返回非零数值否则返回零intislower(intc)如果c是小写字母返回非零数值否则返回零intisprint(intc)如果c是一个可打印字符返回非零数值否则返回零intispunct(intc)如果c是一个可打印字符而不是空格数字或字母返回非零数值否则返回零intisspace(intc)如果c是一个空格字符返回非零数值包括空格CR,FF,HT,NL,和VT否则返回零intisupper(intc)如果c是大写字母返回非零数值否则返回零intisxdigit(intc)如果c是十六进制数字返回非零数值否则返回零inttolower(intc)如果c是大写字母则返回c对应的小写字母其它类型仍然返回cinttoupper(intc)如果c是小写字母则返回c对应的大写字母其它类型仍然返回c4浮点运算库下列函数支持浮点数运算使用这些函数之前必须用#include包含floatasin(floatx)以弧度形式返回x的反正弦值floatacos(floatx)以弧度形式返回x的反余弦值floatatan(floatx)以弧度形式返回x的反正切值floatatan2(floatx,floaty)

返回y/x的反正切其范围在-~+之间floatceil(floatx)返回对应x的一个整型数小数部分四舍五入floatcos(floatx)返回以弧度形式表示的x的余弦值floatcosh(floatx)返回x的双曲余弦函数值floatexp(floatx)返回以e为底的x的幂即exfloatexp10(floatx)返回以10为底的幂即10xfloatfabs(floatx)返回x的绝对值floatfloor(floatx)返回不大于x的最大整数floatfmod(floatx,floaty)返回x/y的余数floatfrexp(floatx,int*pexp)把浮点数x分解成数字部分y尾数和以2为底的指数n两个部分即x=y2ny的范围为0.5y1y值被函数返回而n值存放到pexp指向的变量中floatfround(floatx)返回最接近x的整型数floatldexp(floatx,intexp)返回x2expfloatlog(floatx)返回x的自然对数floatlog10(floatx)返回以10为底的x的对数floatmodf(floatx,float*pint)把浮点数分解成整数部分和小数部分整数部分存放到pint指向的变量小数部分应当大于或等于0而小于1并且作为函数返回值返回floatpow(floatx,floaty)返回xy值floatsqrt(floatx)返回x的平方根floatsin(floatx)返回以弧度形式表示的x的正弦值floatsinh(floatx)返回x的双曲正弦函数值floattan(floatx)返回以弧度形式表示的x的正切值floattanh(floatx)返回x的双曲正切函数值5标准输入输出库标准的文件输入输出是不能真正植入微控制器MCU的标准stdio.h的许多内容不可以使用不过有一些IO函数是被支持的同样使用之前应用"#include"预处理并且需要初始化输出端口最低层的IO程序是单字符的输入(getchar)和输出(putchar)程序如果你针对不同的装置使用高层的IO函数例如用printf输出LCD你需要全部重新定义最底层的函数为在ATMEL的AVRStudio模拟器终端IO窗口使用标准IO函数应当在编译选项中选中

相应的单选钮注意作为缺省单字符输出函数putchar是输出到UART装置没有修改无论如何为使输出能如期望的那样出现在程序终端窗口中'n'字符必须被映射为成对的回车和换行CR/LFintgetchar()使用查寻方式从UART返回一个字符intprintf(char*fmt,..)按照格式说明符输出格式化文本frm字符串格式说明符是标准格式的一个子集%d--输出有符号十进制整数%o--输出无符号八进制整数%x-输出无符号十六进制整数%X–除了大写字母使用'A'-'F'外同%x%u-输出无符号十进制整数%s–输出一个以C中空字符NULL结束的字符串%c–以ASCII字符形式输出只输出一个字符%f–以小数形式输出浮点数%S–输出在FLASH存贮器中的字符串常量printf支持三个版本取决于你的特别需要和代码的大小越高的要求代码越大基本形:只有%c,%d,%x,%u,和%s格式说明符是承认的长整形:针对长整形数的修改%ld,%lu,%lx被支持,以适用于精度要求较高的领域浮点形:全部格式包括%f被支持你使用编译选项对话框来选择版本代码大小的增加是值得关注的intputchar(intc)输出单个字符这个库程序使用了UART以查寻方式输出单个字符注意输出’n’字符至程序终端窗口intputs(char*s)输出以NL结尾的字符串intsprintf(char*buf,char*fmt)按照格式说明符输出格式化文本frm字符串到一个缓冲区格式说明符同printf()"constchar*"支持功能cprintf和csprintf是将FLASH中的格式字符串分别以prinf和sprinf形式输出6标准库和内存分配函数标准库头文件定义了宏NULL和RAND_MAX和新定义的类型size_t并且描述了下列函数注意在你调用任意内存分配程序比如..callocmalloc和realloc)之前必须调用_NewHeap来初始化堆heapintabs(inti)返回i的绝对值intatoi(char*s)转换字符串s为整型数并返回它字符串s起始必须是整型数形式字符否则返回0doubleatof(constchar*s)转换转换字符串s为双精度浮点数并返回它字符串s起始必须是浮点数形式字符串longatol(char*s)转换字符串s为长整型数并返回它字符串s起始必须是长整型数形式字符否则返回0void*calloc(size_tnelem,size_tsize)分配"nelem"个数据项的内存连续空间每个数据项的大小为size字节并且初始化为0如果分配成功返回分配内存单元的首地址否则返回0voidexit(status)终止程序运行典型的是无限循环它是担任用户main函数的返回点voidfree(void*ptr)

释放ptr所指向的内存区void*malloc(size_tsize)分配size字节的存贮区如果分配成功则返回内存区地址如内存不够分配则返回0void_NewHeap(void*start,void*end)初始化内存分配程序的堆一个典型的调用是将符号_bss_end+1的地址用作"start"值符号_bss_end定义为编译器用来存放全局变量和字符串的数据内存的结束加1的目的是堆栈检查函数使用_bss_end字节存贮为标志字节这个结束值不能被放入堆栈中externchar_bss_end;_NewHeap(&_bss_end+1,&_bss_end+201);//初始化200字节大小的堆intrand(void)返回一个在0和RAND_MAX之间的随机数void*realloc(void*ptr,size_tsize)重新分配ptr所指向内存区的大小为size字节size可比原来大或小返回指向该内存区的地址指针voidsrand(unsignedseed)初始化随后调用的随机数发生器的种子数longstrtol(char*s,char**endptr,intbase)按照"base."的格式转换"s"中起始字符为长整型数如果"endptr"不为空*endptr将设定"s"中转换结束的位置unsignedlongstrtoul(char*s,char**endptr,intbase)除了返回类型为无符号长整型数外其余同"strtol"7字符串函数用"#include"预处理后编译器支持下列函数定义了NULL类型size_t和下列字符串及字符阵列函数void*memchr(void*s,intc,size_tn)在字符串s中搜索n个字节长度寻找与c相同的字符如果成功返回匹配字符的地址指针否则返回NULLintmemcmp(void*s1,void*s2,size_tn)对字符串s1和s2的前n个字符进行比较如果相同则返回0如果s1中字符大于s2中字符则返回1如果s1中字符小于s2中字符则返回-1void*memcpy(void*s1,void*s2,size_tn)拷贝s2中n个字符至s1但拷贝区不可以重迭void*memmove(void*s1,void*s2,size_tn)拷贝s2中n个字符至s1返回s1其与memcpy基本相同但拷贝区可以重迭void*memset(void*s,intc,size_tn)在s中填充n个字节的c它返回schar*strcat(char*s1,char*s2)拷贝s2到s1的结尾返回s1char*strchr(char*s,intc)在s1中搜索第一个出现的c包括结束NULL字符如果成功返回指向匹配字符的指针如果没有匹配字符找到返回空指针intstrcmp(char*s1,char*s2)比较两个字符串如果相同返回0如果s1>s2则返回1如果s1

size_tstrlen(char*s)返回字符串s的长度不包括结束NULL字符char*strncat(char*s1,char*s2,size_tn)拷贝字符串s2不含结束NULL字符中n个字符到s1如果s2长度比n小则只拷贝s2返回s1intstrncmp(char*s1,char*s2,size_tn)基本和strcmp函数相同但其只比较前n个字符char*strncpy(char*s1,char*s2,size_tn)基本和strcpy函数相同但其只拷贝前n个字符char*strpbrk(char*s1,char*s2)基本和strcspn函数相同但它返回的是在s1匹配字符的地址指针否则返回NULL指针char*strrchr(char*s,intc)在字符串s中搜索最后出现的c并返回它的指针否则返回_tstrspn(char*s1,char*s2)在字符串s1搜索与字符串s2不匹配的第一个字符包括结束NULL字符其返回s1中找到的第一个不匹配字符的索引char*strstr(char*s1,char*s2)在字符串s1中找到与s2匹配的子字符串如果成功它返回s1中匹配子字符串的地址指针否则返回NULL"constchar*"支持函数这些函数除了它的操作对象是在FLASH中常数字符串外其余同c中的函数size_tcstrlen(constchar*s)char*cstrcpy(char*dst,constchar*src);intcstrcmp(constchar*s1,char*s2);8变量参数函数提供再入式函数的变量参数处理它定义了不确定的类型va_list和三个宏va_start(va_listfoo,)初始化变量foova_arg(va_listfoo,)访问下一个参数分派指定的类型注意那个类型必须是高级类型如intlong或double小的整型类型如"char"不能被支持va_end(va_listfoo)结束变量参数处理例如printf()可以使用vfprintf()来实现#includeintprintf(char*fmt,...){va_listap;va_start(ap,fmt);vfprintf(fmt,ap);va_end(ap);}9堆栈检查函数有几个库函数是用于检查堆栈是否溢出内存图如下如果硬件堆栈增长到软件堆栈中那么软件堆栈的内容将会被改变也就是说局部变量和别的堆栈项目被改变硬件堆栈是用作函数的返回地址如果你的函数调用层次太深偶然会发生这种情况同样地软件堆栈溢出进数据区域将会改变全局变量或其它静态分配的项目如果你使用动态分配内存还会改变堆项目这种情况在你定义了太多的局部变量或一个局部集合变量太大也会偶然发生高端地址

硬件堆栈区警戒线软件堆栈区警戒线数据区低端地址警戒线启动代码写了一个正确的关于数据区的地址字节和一个类似的正确的关于软件堆栈的地址字节作为警戒线[注意如果你使用了你自己的启动文件而其又是以6.20版本之前的启动文件为基础的你将需要额外改造为新的启动文件]注意如果你使用动态分配内存你必须跳过警戒线字节_bss_end来分配你的堆参考内存分配函数堆栈检查你调用_StackCheck(void)函数来检查堆栈溢出如果警戒线字节仍然保持正确的值那么函数检查通过如果堆栈溢出那么警戒线字节将可能被破坏注意当你的程序堆栈溢出的时候你的程序将可能运行不正常或偶然崩溃当_StackCheck检查错误条件时它调用了带一个参数的函数_StackOverflowed(charc)如果参数是1那么硬件堆栈有过溢出如果参数是0那么软件堆栈曾经溢出在那个例子中制造了两个功能调用它是两个堆栈都可能溢出的无论如何在_StackOverflowed执行起作用时第二个调用不可以出现作为例子如果函数复位了CPU那么将不能返回_StackCheck函数缺省的_StackOverflowed函数当它被调用时库会用一个缺省的_StackOverflowed函数来跳转到0的位置因此复位CPU和程序你可能希望用一个函数来代替它以指示更多的错__


本文标签: 返回 函数 字符 堆栈 字符串