首页
前端面试题
前端报错总结
电子书
更多
插件下载
Search
1
JavaScript基础(二)操作符 流程控制
42 阅读
2
HTML基础
20 阅读
3
Vue基础
17 阅读
4
wctype.h
14 阅读
5
Vue2(知识点)
13 阅读
默认分类
HTML CSS
HTML基础
CSS
HTML5 CSS3
javaScript
javaScript基础
javaScript高级
Web APIs
jQuery
js小总结
WEB开发布局
Vue
PS切图
数据可视化
Git使用
Uniapp
c语言入门
标准库
嵌入式
登录
Search
liuxiaobai
累计撰写
108
篇文章
累计收到
12
条评论
首页
栏目
默认分类
HTML CSS
HTML基础
CSS
HTML5 CSS3
javaScript
javaScript基础
javaScript高级
Web APIs
jQuery
js小总结
WEB开发布局
Vue
PS切图
数据可视化
Git使用
Uniapp
c语言入门
标准库
嵌入式
页面
前端面试题
前端报错总结
电子书
插件下载
搜索到
104
篇与
的结果
2023-09-20
stdio.h
stdio.hstdio.h是 C 语言的标准 I/O 库,用于读取和写入文件,也用于控制台的输入和输出。标准 I/O 函数以下函数用于控制台的输入和输出。printf():输出到控制台,详见《基本语法》一章。scanf():从控制台读取输入,详见《I/O 函数》一章。getchar():从控制台读取一个字符,详见《I/O 函数》一章。putchar():向控制台写入一个字符,详见《I/O 函数》一章。gets():从控制台读取整行输入(已废除),详见《I/O 函数》一章。puts():向控制台写入一个字符串,详见《I/O 函数》一章。文件操作函数以下函数用于文件操作,详见《文件操作》一章。fopen():打开文件。fclose():关闭文件。freopen():打开一个新文件,关联一个已经打开的文件指针。fprintf():输出到文件。fscanf():从文件读取数据。getc():从文件读取一个字符。fgetc():从文件读取一个字符。putc():向文件写入一个字符。fputc():向文件写入一个字符。fgets():从文件读取整行。fputs():向文件写入字符串。fread():从文件读取二进制数据。fwrite():向文件写入二进制数据。fseek():将文件内部指针移到指定位置。ftell():获取文件内部指针的当前位置。rewind():将文件内部指针重置到文件开始处。fgetpos():获取文件内部指针的当前位置。fsetpos():设置文件内部指针的当前位置。feof():判断文件内部指针是否指向文件结尾。ferror():返回文件错误指示器的状态。clearerr():重置文件错误指示器。remove():删除文件。rename():文件改名,以及移动文件。字符串操作函数以下函数用于操作字符串,详见《字符串操作》一章。sscanf():从字符串读取数据,详见《I/O 函数》一章。sprintf():输出到字符串。snprintf():输出到字符串的更安全版本,指定了输出字符串的数量。tmpfile()tmpfile()函数创建一个临时文件,该文件只在程序运行期间存在,除非手动关闭它。它的原型如下。FILE* tmpfile(void);tmpfile()返回一个文件指针,可以用于访问该函数创建的临时文件。如果创建失败,返回一个空指针 NULL。FILE* tempptr; tempptr = tmpfile();调用close()方法关闭临时文件后,该文件将被自动删除。tmpfile()有两个缺点。一是无法知道临时文件的文件名,二是无法让该文件成为永久文件。tmpnam()tmpname()函数为临时文件生成一个名字,确保不会与其他文件重名。它的原型如下。char* tmpname(char* s);它的参数是一个字符串变量,tmpnam()会把临时文件的文件名复制到这个变量里面,并返回指向该字符串变量的指针。如果生成文件名失败,tmpnam()返回空指针 NULL。char filename[L_tmpnam]; if (tmpnam(filename) != NULL) // 输出诸如 /tmp/filew9PMuZ 的文件名 printf("%s\n", filename); else printf("Something wrong!\n");上面示例中,L_tmpnam是stdio.h定义的一个宏,指定了临时文件的文件名长度。tmpname()的参数也可以是一个空指针 NULL,同样返回指向文件名字符串的指针。char* filename; filename = tmpnam(NULL);上面示例中,变量filename就是tmpnam()生成的文件名。该函数只是生成一个文件名,稍后可以使用fopen()打开该文件并使用它。fflush()fflush()用于清空缓存区。它接受一个文件指针作为参数,将缓存区内容写入该文件。fflush(fp);如果不需要保存缓存区内容,则可以传入空指针 NULL。fflush(NULL);如果清空成功,fflush()返回0,否则返回 EOF。注意,fflush()一般只用来清空输出缓存区(比如写文件)。如果使用它来清空输入缓存区(比如读文件),属于未定义行为。fflush()的一个用途是不等回车键,就强迫输出缓存区。大多数系统都是行缓存,这意味着只有遇到回车键(或者缓存区满了,或者文件读到结尾),缓存区的内容才会输出,fflush()可以不等回车键,立即输出。for (int i = 9; i >= 0; i--) { printf("\r%d", i); fflush(stdout); sleep(1); }上面示例是一个倒计时效果,\r是回车键,表示每轮循环都会回到当前行的行首,等于删除上一轮循环的输出。fflush(stdout)表示立即将缓存输出到显示器,这一行是必需的,否则由于上一行的输出没有回车键,不会触发缓存输出,屏幕上不会显示任何内容,只会等到程序运行结束再一次性输出。setvbuf()setvbuf()函数用于定义某个字节流应该如何缓存。它可以接受四个参数。int setvbuf(FILE* stream, char* buffer, int mode, size_t size)第一个参数stream是文件流。第二个参数buffer是缓存区的地址。第三个参数mode指定缓存的行为模式,它是下面三个宏之一,这些宏都定义在stdio.h。_IOFBF:满缓存。当缓存为空时,才从流读入数据;当缓存满了,才向流写入数据。一般情况下,这是默认设置。_IOLBF:行缓存。每次从流读入一行数据,或向流写入一行数据,即以行为单位读写缓存。_IONBF:无缓存。不使用缓存区,直接读写设备。第四个参数size指定缓存区的大小。较大的缓存区提供更好的性能,而较小的缓存区可以节省空间。stdio.h提供了一个宏BUFSIZ,表示系统默认的缓存区大小。它的意义在于,使得用户可以在打开一个文件之前,定义自己的文件缓冲区,而不必使用fopen()函数打开文件时设定的默认缓冲区。char buffer[N]; setvbuf(stream, buffer, _IOFBF, N);上面示例设置文件流stream的缓存区从地址buffer开始,大小为N,模式为_IOFBF。setvbuf()的第二个参数可以为空指针 NULL。这样的话,setvbuf()会自己创建一个缓存区。注意,setvbuf()的调用必须在对文件流执行任何操作之前。如果调用成功,setvbuf()的返回值为0,否则返回非零值。下面的例子是将缓存区调整为行缓存。FILE *fp; char lineBuf[1024]; fp = fopen("somefile.txt", "r"); setvbuf(fp, lineBuf, _IOLBF, 1024);setbuf()setbuf()是setvbuf()的早期版本,可以视为后者的简化版本,也用来定义某个字节流的缓存区。void setbuf(FILE* stream, char* buffer);它的第一个参数stream是文件流,第二个参数buffer是缓存区的地址。它总是可以改写成setvbuf()。char buffer[BUFSIZ]; setbuf(stream, buffer); // 等同于 setvbuf(stream, buffer, _IOFBF, BUFSIZ);上面示例中,BUFSIZ是stdio.h定义的宏,表示系统默认的缓存区大小。setbuf()函数没有返回值。setbuf()的第二个参数如果设置为 NULL,表示不进行缓存。setbuf(stdout, NULL); // 等同于 setvbuf(stdout, NULL, _IONBF, 0);ungetc()ungetc()将从缓存里面读取的上一个字符,重新放回缓存,下一个读取缓存的操作会从这个字符开始。有些操作需要了解下一个字符是什么,再决定应该怎么处理,这时这个函数就很有用。它的原型如下。int ungetc(int c, FILE *stream);它的第一个参数是一个字符变量,第二个参数是一个打开的文件流。它的返回值是放回缓存的那个字符,操作失败时,返回 EOF。int ch = fgetc(fp); if (isdigit(ch)) { ch = fgetc(fp); } ungetc(ch, fp);上面示例中,如果读取的字符不是数字,就将其放回缓存。perror()perror()用于在 stderr 的错误信息之前,添加一个自定义字符串。void perror(const char *s);该函数的参数就是在报错信息前添加的字符串。它没有返回值。#include <stdio.h> #include <stdlib.h> #include <math.h> #include <errno.h> int main(void) { int x = -1; errno = 0; float y = sqrt(x); if (errno != 0) { perror("sqrt error"); exit(EXIT_FAILURE); } }上面示例中,求-1的平方根,导致报错。头文件errno.h提供宏errno,只要上一步操作出错,这个宏就会设置成非零值。perror()用来在报错信息前,加上sqrt error的自定义字符串。执行上面的程序,就会得到下面的报错信息。$ gcc test.c -lm $ ./a.out sqrt error: Numerical argument out of domain可变参数操作函数(1)输出函数下面是printf()的变体函数,用于按照给定格式,输出函数的可变参数列表(va_list)。vprintf():按照给定格式,输出到控制台,默认是显示器。vfprintf():按照给定格式,输出到文件。vsprintf():按照给定格式,输出到字符串。vsnprintf():按照给定格式,输出到字符串的安全版本。它们的原型如下,基本与对应的printf()系列函数一致,除了最后一个参数是可变参数对象。#include <stdio.h> #include <stdarg.h> int vprintf( const char * restrict format, va_list arg ); int vfprintf( FILE * restrict stream, const char * restrict format, va_list arg ); int vsprintf( char * restrict s, const char * restrict format, va_list arg ); int vsnprintf( char * restrict s, size_t n, const char * restrict format, va_list arg );它们的返回值都为输出的字符数,如果出错,返回负值。vsprintf()和vsnprintf()的第一个参数可以为 NULL,用来查看多少个字符会被写入。下面是一个例子。int logger(char *format, ...) { va_list va; va_start(va, format); int result = vprintf(format, va); va_end(va); printf("\n"); return result; } // 输出 x = 12 and y = 3.20 logger("x = %d and y = %.2f", x, y);(2)输入函数下面是scanf()的变体函数,用于按照给定格式,输入可变参数列表 (va_list)。vscanf():按照给定格式,从控制台读取(默认为键盘)。vfscanf():按照给定格式,从文件读取。vsscanf():按照给定格式,从字符串读取。它们的原型如下,跟对应的scanf()函数基本一致,除了最后一个参数是可变参数对象。#include <stdio.h> #include <stdarg.h> int vscanf( const char * restrict format, va_list arg ); int vfscanf( FILE * restrict stream, const char * restrict format, va_list arg ); int vsscanf( const char * restrict s, const char * restrict format, va_list arg );它们返回成功读取的项数,遇到文件结尾或错误,则返回 EOF。下面是一个例子。int error_check_scanf(int expected_count, char *format, ...) { va_list va; va_start(va, format); int count = vscanf(format, va); va_end(va); assert(count == expected_count); return count; } error_check_scanf(3, "%d, %d/%f", &a, &b, &c);
2023年09月20日
4 阅读
0 评论
0 点赞
2023-09-20
stdint.h
stdint.h固定宽度的整数类型stdint.h 定义了一些固定宽度的整数类型别名,主要有下面三类。宽度完全确定的整数intN_t,比如int32_t。宽度不小于某个大小的整数int_leastN_t,比如int_least8_t。宽度不小于某个大小、并且处理速度尽可能快的整数int_fastN_t,比如int_fast64_t。上面所有类型都是有符号的,类型名前面可以加一个前缀u,表示无符号类型,比如uint16_t。C 语言标准要求定义以下类型。int8_t(可选) uint8_t(可选)int16_t(可选) uint16_t(可选)int32_t(可选) uint32_t(可选)int64_t(可选) uint64_t(可选)int_least8_t uint_least8_tint_least16_t uint_least16_tint_least32_t uint_least32_tint_least64_t uint_least64_tint_fast8_t uint_fast8_tint_fast16_t uint_fast16_tint_fast32_t uint_fast32_tint_fast64_t uint_fast64_t最大宽度的整数类型以下两个类型表示当前系统可用的最大宽度整数。intmax_tuintmax_t如果想要尽可能大的整数时,可以使用上面类型。固定宽度的整数常量以下一些带参数的宏,可以生成固定宽度的整数常量。INT8_C(x) UINT8_C(x)INT16_C(x) UINT16_C(x)INT32_C(x) UINT32_C(x)INT64_C(x) UINT64_C(x)INTMAX_C(x) UINTMAX_C(x)下面是用法示例。uint16_t x = UINT16_C(12); intmax_t y = INTMAX_C(3490);固定宽度的整数极限值下面一些宏代表了固定宽度的整数最大值和最小值。INT8_MAX INT8_MIN UINT8_MAXINT16_MAX INT16_MIN UINT16_MAXINT32_MAX INT32_MIN UINT32_MAXINT64_MAX INT64_MIN UINT64_MAXINT_LEAST8_MAX INT_LEAST8_MIN UINT_LEAST8_MAXINT_LEAST16_MAX INT_LEAST16_MIN UINT_LEAST16_MAXINT_LEAST32_MAX INT_LEAST32_MIN UINT_LEAST32_MAXINT_LEAST64_MAX INT_LEAST64_MIN UINT_LEAST64_MAXINT_FAST8_MAX INT_FAST8_MIN UINT_FAST8_MAXINT_FAST16_MAX INT_FAST16_MIN UINT_FAST16_MAXINT_FAST32_MAX INT_FAST32_MIN UINT_FAST32_MAXINT_FAST64_MAX INT_FAST64_MIN UINT_FAST64_MAXINTMAX_MAX INTMAX_MIN UINTMAX_MAX注意,所有无符号整数类型的最小值都为0,所以没有对应的宏。占位符C 语言还在头文件 inttypes.h 里面,为上面类型定义了printf()和scanf()的占位符,参见《inttypes.h》一章。
2023年09月20日
2 阅读
0 评论
0 点赞
2023-09-20
stddef.h
stddef.hstddef.h提供了常用类型和宏的定义,但没有声明任何函数。这个头文件定义的类型如下。ptrdiff_t:指针相减运算时,返回结果的数据类型。size_t:sizeof运算符返回的类型。wchar_t:一种足够大、能容纳各种字符的类型。以上三个类型都是整数类型,其中ptrdiff_t是有符号整数,size_t是无符号整数。stddef.h定义了两个宏。NULL:空指针。offsetof()offsetof()offsetof()是stddef.h定义的一个宏,用来返回某个属性在 Struct 结构内部的起始位置。由于系统为了字节对齐,可能会在 Struct 结构的属性之间插入空字节,这个宏对于确定某个属性的内存位置很有用。它是一个带参数的宏,接受两个参数。第一个参数是 Struct 结构,第二个参数是该结构的一个属性,返回 Struct 起始位置到该属性之间的字节数。struct s { char a; int b[2]; float c; }; printf("%zu\n", offsetof(struct s, a)); // 0 printf("%zu\n", offsetof(struct s, b)); // 4 printf("%zu\n", offsetof(struct s, c)); // 12对于上面这个 Struct 结构,offsetof(struct s, a)一定等于0,因为a属性是第一个属性,与 Struct 结构自身的地址相同。系统为了字节对齐,在a属性后面分配了3个空字节,导致b属性存储在第4个字节,所以offsetof(struct s, b)和offsetof(struct s, c)分别是4和12。
2023年09月20日
6 阅读
0 评论
0 点赞
1
...
6
7
8
...
35