C标准输入与标准输出——stdin,stdout
🔗 《C语言趣味教程》👈 猛戳订阅!!!
—— 热门专栏《维生素C语言》的重制版 ——
- 💭 写在前面:这是一套 C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅!本专栏保证篇篇精品,继续保持本人一贯的幽默式写作风格,当然,在有趣的同时也同样会保证文章的质量,旨在能够产出 "有趣的干货" !本系列教程不管是零基础还是有基础的读者都可以阅读,可以先看看目录! 标题前带星号 (*) 的部分不建议初学者阅读,因为内容难免会超出当前章节的知识点,面向的是对 C 语言有一定基础或已经学过一遍的读者,初学者可自行选择跳过带星号的标题内容,等到后期再回过头来学习。值得一提的是,本专栏 强烈建议使用网页端阅读! 享受极度舒适的排版!你也可以展开目录,看看有没有你感兴趣的部分!希望需要学 C 语言的朋友可以耐下心来读一读。最后,可以订阅一下专栏防止找不到。
" 有趣的写作风格,还有特制的表情包,而且还干货满满!太下饭了!"
—— 沃兹基硕德
目录
Ⅰ. 输入和输出(Input & Output)
0x00 引入:I/O 的概念
0x01 标准 I/O 流
0x01 回顾:标准输入输出库 stdio.h
0x02 printf 函数初探
0x03 scanf 函数初探
0x04 常见报错 C4996:scanf 可能不安全
Ⅱ. 标准输出(stdout)
0x00 什么!printf 函数居然有返回值?
0x01 探索 printf 函数 “原型”
0x02 printf 支持格式化宽度 %xd
0x03 printf 浮点数精度控制
0x04 sprintf 函数
* 0x05 fprintf 函数
Ⅲ. 标准输入(stdin)
0x00 scanf 的返回值
0x01 scanf 自动跳过空白字符的 “特性”
* 0x02 缓冲区问题
* 0x03 scanf 函数安全性问题探讨
0x04 sscanf 函数
* 0x05 fscanf 函数
Ⅰ. 输入和输出(Input & Output)
0x00 引入:I/O 的概念
计算机中的输入和输出,简称 ,其中:
代表 Input,即输入。
代表 Output,即输出。
IO 是指计算机系统与外部世界进行信息交流和数据传输的过程。
输入是指将外部信息引入计算机系统,而输出是将计算机系统处理后的信息传递回外部世界。
其本质是 计算机与外部世界之间的信息交流和数据传输过程。
0x01 标准 I/O 流
C 语言中标准 I/O 流为 stdin 和 stdout
它们分别用于标准输入和标准输出,stdin 就是输入,可以从键盘读取用户输入的内容,
再利用 stdout 输出将结果打印到屏幕上,
(对于 stdin 和 stdout 的具体知识点我们将通过 printf 和 scanf 函数来展开讲解)
I/O 流的存在,使得 C 程序可以与用户进行交互,并通过控制台窗口进行输入和输出。
值得一提的是,在标准 C 库中,stdin
和 stdout
是已经定义好的流,无需额外的设置或配置。
此外,还有一个标准错误流
stderr
,用于将错误消息输出到屏幕,我们以后会讲解。
0x01 回顾:标准输入输出库 stdio.h
这里我们再回顾一下 C 标准库 <stdio.h>,其
全名为 Standard Input/Output Library:
(我们在第一章就介绍过该库了,既然本章我们展开学习输入输出,我们就重提一下)
是 C 语言中用于处理输入和输出操作的核心库之一,C语言本身是不自带输入输出的函数的。
之所以叫做 stdio 是因为 standard input & output,而它表示了这库中最经典的两个函数:
- printf:标准输入函数(input)
- scanf:标准输出函数(output)
下面我们就先来介绍一下这两个函数,它们分别用来输入和输出!
0x02 printf 函数初探
在第一章中我们就简单介绍过这个函数了,我们在写第一个程序 HelloWorld 时就用到了它:
#include <stdio.h>int main(void)
{printf("Hello, World!\n");return 0;
}
在使用 printf 函数之前,要添加 stdio.h 头文件,因为 printf 函数并不是 C 语言本身自带的。
对应了标准输出流 stdout
💬 代码演示:printf 函数的用法
#include <stdio.h>int main(void)
{printf("Hello,World!\n");int a = 100;printf("a=%d", a);return 0;
}
🚩 运行结果如下:
我们来看一下这个函数的 "原型":
int printf(const char* format [, argument] ...);
0x03 scanf 函数初探
对于输入,我们可以使用 C 标准库 stdio 中的 scanf 函数,针对标准输入流 stdin。
💬 代码演示:使用 scanf 接收用户输入的数据
#include <stdio.h>int main(void) {int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("a=%d, b=%d\n", a, b);return 0;
}
🚩 运行结果如下:(假设用户输入 10 20)
其中 & 符号代表取地址,因为要读取数据,所以需要知道数据被存到了哪里。
这里不带 & 则会 warning C4477: “scanf”: 格式字符串“%d”需要类型“int *”的参数,但可变参数 1 拥有了类型“int”。
这里学完指针之后,就能很好地理解了,对于初学者理解取地址的概念还是比较困难的。
scanf
函数需要使用 &
操作符来获取变量的地址,因为它需要知道在内存中存储用户输入的值的确切位置。
当你在 scanf
函数中使用一个变量作为参数时,你需要告诉 scanf
函数该变量在内存中的位置,以便将输入的值存储到正确的地方。这是通过使用 &
操作符来获取变量的地址来实现的。
例如,如果你有一个整数变量 x
,要在 scanf
中读取它的值,我们就需要:
scanf("%d", &x);
(现在实在理解不了也没有关系,后续再回来理解即可)
0x04 常见报错 C4996:scanf 可能不安全
error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
呵呵,这是 VS 编译器的安全提示,告诉我们输入的函数是不安全的,臭名昭著的 C4996!
大致意思就是告诉你:我 VS 觉得这个函数是不安全的,建议你用更安全的函数,于是乎......
VS 就推出了像 scanf_s 这样的函数,搞出了一揽子 _s 的版本,美名其曰 "安全版本的函数"。
所以,scanf_s 并不是标准 C 语言提供的,而是 VS 编译器提供的。
但考虑到代码跨平台,比如跨到 GCC 那,就会无法识别,这牺牲了代码的跨平台性和可移植性。
"仅个人观点,我觉得这完全是脱裤子放屁,弊大于利的!"
不想看到这种提示或不想听它喋喋不休的安全警告,解决方案也是多的一笔雕凿。
最常见的就是代码开头直接加上 #define _CRT_SECURE_NO_WARNINGS ,请阁下直接 CV:
#define _CRT_SECURE_NO_WARNINGS
不想每次创建新源文件都复制,想一劳永逸,可以在 VS 安装路径下搜索 newc++file.cpp 文件,
在文件开头添加这行代码,如此一来,每次创建新的源文件就会自动添加这玩意了。
还可以通过取消勾选安全开发生命周期 (SDL) 检查来解决,方法有很多这里就不多哔哔赖赖了。
Ⅱ. 标准输出(stdout)
0x00 什么!printf 函数居然有返回值?
"什么?printf 函数居然有返回值?"
打开 MSDN,或者 C++ reference 我们可以看到:
int printf(const char* format [,argument]...);
首先我们可以看到 printf 函数是有返回值的,返回一个整型,表示成功打印的字符数。
我们先来试试接收一下 printf 函数的返回值,看看是否真的有这么个东西。
💬 代码演示:接收 printf 的返回值
#include <stdio.h>int main(void)
{int ret = printf("Hello, World!\n");printf("%d", ret);return 0;
}
🚩 运行结果如下:
这里我们使用 ret 接收了调用 printf 之后的返回值,打印出来是 14,我们暂且不去关注它。
我们暂时只需要知道一点,就是 printf 函数是有返回值的,我们也用代码证明了这一点。
当 printf 输出输错错误时,会返回负值。
因此,我们可以通过检查 printf 的返回值来检测打印是否成功,返回值非负即打印成功。
通常情况下,我们并不需要关心它的返回值,因为 printf 函数在大多数情况下都会成功打印。
但在某些情况下,例如输出到一个已关闭的文件流或内存缓冲区已满的情况下,可能会失败。
💬 代码演示:判断 printf 函数是否打印成功
int res = printf("Hello, World!\n");if (res >= 0) {printf("printf 成功打印了 %d 个字符。\n", result);
}
else {printf("printf 打印失败。\n");
}
0x01 探索 printf 函数 “原型”
int printf(const char* format [,argument]...);
我们继续观察,其中
const char *format
是一个字符串参数,用于定义输出的格式。
包含了普通文本字符和格式控制符,格式控制符以百分号(%)开头,后面跟着一个字符,
表示将要输出的数据类型(如整数、浮点数、字符串等)以及如何格式化这些数据。
后面的 ...
表示 printf 函数可以接受任意数量的参数。
这些参数将与格式字符串中的格式控制符匹配,每个参数对应一个格式控制符,比如:
#include <stdio.h>int main(void)
{int a = 10;double b = 3.14159;printf("%d %f\n", a, b);return 0;
}
🚩 运行结果如下:
0x02 printf 支持格式化宽度 %xd
你可以在格式控制符中指定字段的宽度,以控制输出的对齐和填充: %xd
比如 %5d
表示输出一个宽度为 5 的整数字段,如果数字少于 5 位数,会在前面用空格进行填充。
printf("%5d\n", 42);
0x03 printf 浮点数精度控制
对于浮点数,而可以使用精度控制 .x 来限制小数点后面的位数:
printf("%.2lf\n", 3.14159);
其中,.2 表示保留两位小数,那么 printf 的结果将会是 3.14。
0x04 sprintf 函数
📂 头文件:#include <stdio.h>
📚 作用:把一个格式化的数据转换成字符串。
🔍 MSDN介绍:sprintf - C++ Reference
💬 代码演示:sprintf 的用法
#include <stdio.h>struct S {char arr[10];int age;float f;
};int main(void) {struct S s = { "hello", 20, 3.14f };char buffer[100] = { 0 }; // 用于存放sprintf(buffer, "%s %d %f", s.arr, s.age, s.f); // 把这些信息放到buffer中了printf("%s\n", buffer); // 将buffer打印出来return 0;
}
🚩 运行结果如下:
* 0x05 fprintf 函数
📂 头文件:#include <stdio.h>
📚 针对所有输出流的格式化输出语句 - stdout / 文件
🔍 MSDN介绍:fprintf - C++ Reference
💬 代码演示:随便创建一个文件,在文件中写入一段话
#include <stdio.h>char data[] = "Hey, nice to meet you~";int main(void) {FILE* pf = fopen("test1.txt", "w");if (pf == NULL) {perror("fopen");return 1;}// 使用fprintf写文件fprintf(pf, "%s", data);fclose(pf);pf = NULL;return 0;
}
🚩 (代码成功运行)
Ⅲ. 标准输入(stdin)
0x00 scanf 的返回值
我们还是来看看 scanf 的 "原型":
int scanf(const char* format [,argument]... );
我们可以看到,scanf 函数和 printf 函数一样,scanf 函数也是有返回值的。
- 如果 scanf 成功读取了一个数据项 (按照格式字符串中的格式要求) ,则返回值为 1。这表示成功读取了一个数据项,并且该数据项已存储在相应的变量中。
- 如果 scanf 未能成功读取任何数据项,即输入与格式字符串不匹配或者遇到了 EOF,则返回值为 0。
- 如果在读取过程中发生错误,如无法打开文件或格式字符串中的格式不正确,返回值通常为 EOF(-1)。
对于具有多个格式化指令的 scanf 语句,返回值将是成功读取的数据项数量的总和。
举个例子,如果 scanf 语句包含两个 %d 格式化指令,而且成功读取了两个整数,返回值将是 2。
0x01 scanf 自动跳过空白字符的 “特性”
scanf 函数在 读取非字符串数据类型时会自动跳过空白字符 (空格、制表符、换行符等) 。
这意味着它会忽略输入中的空格等字符,直到找到一个非空白字符或达到格式字符串的结束。
💬 举个例子:scanf 自动跳过空白字符
int num1, num2;
scanf("%d %d", &num1, &num2);
用户可以在两个整数之间输入任意数量的空格、制表符或换行符,
scanf 都会正确读取这两个整数,可以自己放到编译器里,自己运行输入试试。
值得注意的是:虽然 scanf 会跳过空白字符,但它并不会在格式化指令中的空格之间进行跳过。
例如,如果格式字符串为 %d%d,那么输入中的空白字符将不会被跳过,会与格式精确匹配。
* 0x02 缓冲区问题
缓冲区问题在 C 语言中经常出现,尤其是在使用输入函数(如 scanf、gets 等)时。
这个问题主要涉及到输入函数与输入缓冲区之间的交互,可能会导致程序行为与预期不符。
以下是有关缓冲区问题的一些重要细节:
- 输入缓冲区:输入函数(如 scanf)通常会将用户输入存储在一个缓冲区中,等待程序读取。这允许用户在按回车键之前输入多个字符,并且输入函数只会读取一个完整的数据项。缓冲区会自动刷新,将数据传递给程序。
- 换行符(回车键):用户在终端输入时,通常会按下回车键(换行符)来提交输入。这个换行符也被存储在输入缓冲区中,并被看作是输入的一部分。
我们下面举一个使用 scanf 函数时出现的缓冲区问题的例子。
💬 代码演示:scanf 缓冲区问题
#include <stdio.h>int main(void)
{int num;printf("输入一个数字: ");scanf("%d", &num);printf("你输入了: %d\n", num);return 0;
}
💡 解读:如果用户输入 "42" 然后按下回车键,一切正常。但是,如果用户输入 "42abc" 然后按下回车键,scanf 将读取 "42" 作为整数,并将 "abc" 保留在输入缓冲区中,以供下一次输入使用,这可能导致未预期的行为。
🔍 解决方案:
- 清空输入缓冲区:为了解决缓冲区问题,可以使用 fflush(stdin) 来清空输入缓冲区。然而,需要注意的是,fflush(stdin) 不是C标准的一部分,因此在不同的编译器和平台上表现可能不同,且可能不是可移植的方法。另外,fflush(stdin)在某些编译器中可能会导致未定义的行为,因此不建议使用。
- 换一个安全的输入方法:为了避免缓冲区问题,可以使用安全的输入方法,如 fgets 函数读取一行输入,然后解析该行。这样可以更好地控制输入,并且不会留下未处理的字符在输入缓冲区中。
* 0x03 scanf 函数安全性问题探讨
scanf 函数的安全性问题主要涉及到缓冲区溢出和格式字符串漏洞。
首先是 缓冲区溢出,这个我们在刚才已经介绍过了。scanf 函数不提供对输入缓冲区大小的检查和限制,这意味着如果输入的数据超过了目标变量所分配的内存空间,就可能导致缓冲区溢出。这种情况可能会破坏程序的内存结构,导致程序崩溃或安全漏洞。
格式字符串漏洞:格式字符串参数在 scanf 中是非常强大的,但也容易受到恶意用户输入的攻击。如果用户能够控制格式字符串,就可以进行格式字符串漏洞攻击,可能导致程序信息泄漏、崩溃或被入侵。因此,应该避免使用来自用户的未经验证的格式字符串。
char format[20];
scanf("%s", format); // 恶意用户可以输入恶意格式字符串
scanf(format); // 安全漏洞,用户可以控制程序行为
为了避免格式字符串漏洞,应该避免将用户输入直接用作格式字符串,或者使用格式化函数(如printf)时进行严格的格式化控制。
未处理的错误:scanf 函数在输入不匹配格式字符串的情况下会返回失败,但它通常不提供足够的错误信息来帮助程序员精确定位问题。这可能导致难以调试的问题,尤其是在复杂的输入和格式字符串组合中。
缺乏输入验证:scanf 不提供输入验证功能,因此程序员需要自行验证用户输入,以确保输入数据满足预期的条件。如果未进行适当的输入验证,可能会导致不安全的输入数据被接受。
因此,为了提高程序的安全性和可靠性,应该采取以下措施:
- 使用带有长度限制的输入函数,如 fgets,以避免缓冲区溢出。
- 不直接使用来自用户的输入作为格式字符串或者对格式字符串进行有效的验证。
- 在使用 scanf 时,必要时可检查其返回值,以确保成功读取了所需的数据项。
- 进行严格的输入验证,以确保输入数据满足预期的条件,防止不安全的输入被接受。
- 在可能的情况下,使用更安全的输入函数或库,如 strtok、strtol 等,以减少潜在的安全风险。
0x04 sscanf 函数
int sscanf (const char* buffer, const char* format [, argument ] ...)
sscanf 函数比 scanf 多了一个 buffer。
📂 头文件:#include <stdio.h>
📚 作用:从一个字符串中读取一个格式化的数据。
🔍 MSDN介绍:sscanf - C++ Reference
💬 代码演示:利用 sscanf 从 buffer 字符串中还原出结构体的数据
#include <stdio.h>struct S {char arr[10];int age;float f;
};int main(void) {struct S s = { "hello", 20, 3.14f };struct S tmp = { 0 };char buffer[100] = { 0 };sprintf(buffer, "%s %d %f", s.arr, s.age, s.f); // 把这些信息放到buffer中了printf("%s\n", buffer);// 从buffer字符串中还原出一个结构体数据sscanf(buffer, "%s %d %f", tmp.arr, &(tmp.age), &(tmp.f));printf("%s %d %f\n", tmp.arr, tmp.age, tmp.f);return 0;
}
🚩 运行结果如下:
* 0x05 fscanf 函数
int fscanf (FILE* stream,const char* format [, argument ]... );
📂 头文件:#include <stdio.h>
📚 针对所有输入流的格式化输入语句 - stdin / 文件
🔍 MSDN介绍:fscanf - C++ Reference
💬 代码演示:fscanf 的用法
#include <stdio.h>int data; // 存放读到的数据int main(void) {FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("fopen");return 1;}// 使用fscanf读文件fscanf(pf, "%d", &data);// 将读到的数据打印printf("%d\n", data);fclose(pf);pf = NULL;return 0;
}
🚩 运行结果如下:
📌 [ 笔者 ] 王亦优 | 雷向明
📃 [ 更新 ] 2023.3.
❌ [ 勘误 ] /* 暂无 */
📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!
📜 参考文献: - C++reference[EB/OL]. []. http://www.cplusplus.com/reference/. - Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. . - 百度百科[EB/OL]. []. https://baike.baidu.com/. - 维基百科[EB/OL]. []. https://zh.wikipedia.org/wiki/Wikipedia - R. Neapolitan, Foundations of Algorithms (5th ed.), Jones & Bartlett, 2015. - B. 比特科技. C/C++[EB/OL]. 2021[2021.8.31] - 林锐博士. 《高质量C/C++编程指南》[M]. 1.0. 电子工业, 2001.7.24. - 陈正冲. 《C语言深度解剖》[M]. 第三版. 北京航空航天大学出版社, 2019. - 侯捷. 《STL源码剖析》[M]. 华中科技大学出版社, 2002. - T. Cormen《算法导论》(第三版),麻省理工学院出版社,2009年。 - T. Roughgarden, Algorithms Illuminated, Part 1~3, Soundlikeyourself Publishing, 2018. - J. Kleinberg&E. Tardos, Algorithm Design, Addison Wesley, 2005. - R. Sedgewick&K. Wayne,《算法》(第四版),Addison-Wesley,2011 - S. Dasgupta,《算法》,McGraw-Hill教育出版社,2006。 - S. Baase&A. Van Gelder, Computer Algorithms: 设计与分析简介》,Addison Wesley,2000。 - E. Horowitz,《C语言中的数据结构基础》,计算机科学出版社,1993 - S. Skiena, The Algorithm Design Manual (2nd ed.), Springer, 2008. - A. Aho, J. Hopcroft, and J. Ullman, Design and Analysis of Algorithms, Addison-Wesley, 1974. - M. Weiss, Data Structure and Algorithm Analysis in C (2nd ed.), Pearson, 1997. - A. Levitin, Introduction to the Design and Analysis of Algorithms, Addison Wesley, 2003. - A. Aho, J. - E. Horowitz, S. Sahni and S. Rajasekaran, Computer Algorithms/C++, Computer Science Press, 1997. - R. Sedgewick, Algorithms in C: 第1-4部分(第三版),Addison-Wesley,1998 - R. Sedgewick,《C语言中的算法》。第5部分(第3版),Addison-Wesley,2002 |
相关文章:

C标准输入与标准输出——stdin,stdout
🔗 《C语言趣味教程》👈 猛戳订阅!!! —— 热门专栏《维生素C语言》的重制版 —— 💭 写在前面:这是一套 C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅&#…...

如何将home目录空间扩充到根目录下
目录 1、查看查看磁盘使用情况2、扩容思路3、卸载并删除/home4、扩大/root逻辑卷5、扩大/文件系统6、重建/home逻辑卷7、创建/home文件系统8、将新建的文件系统挂载到/home目录下9、恢复/home并删除备份10、再次查看看磁盘存储 系统:centos7.9 1、查看查看磁盘使用…...

Ceph PG Peering数据修复
ceph数据修复 当PG完成了Peering过程后,处于Active状态的PG就可以对外提供服务了。如果该PG的各个副本上有不一致的对象,就需要进行修复。 Ceph的修复过程有两种:Recovery和Backfill。 Recovery是仅依据PG日志中的缺失记录来修复不一致的对…...

服务器上使用screen和linux的基本操作
临时换源 pip install torch1.7.1 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package pip install torch1.7.1 -i http://pypi.douban.com/simple some-package临时清华源和豆瓣源 配环境的一点小问题 我们尽量是去配置能满足代码的环境,而不要想着修改…...

Kafka3.0.0版本——文件存储机制
这里写木目录标题 一、Topic 数据的存储机制1.1、Topic 数据的存储机制的概述1.2、Topic 数据的存储机制的图解1.3、Topic 数据的存储机制的文件解释 二、Topic数据的存储位置示例 一、Topic 数据的存储机制 1.1、Topic 数据的存储机制的概述 Topic是逻辑上的概念,…...

Linux如何安装MySQL
Linux安装MySQL5.7 1、下载 官网下载地址:http://dev.mysql.com/downloads/mysql/ 2、复制下面几个文件 3、检查当前系统是否安装过mysql、检查当前mysql依赖环境、检查/tmp文件夹权限 1)检查当前系统是否安装过mysql,执行安装命令前&am…...

确保网络的安全技术介绍
防火墙技术 防火墙是隔离本地网络与外界网络的一道防御系统。通常用于内部局域网 与外部广域网之间,通过限制外部网络用户以非法手段来访问内部资源,来达到保 护内部网络的安全。根据安全规则,防火墙对任何外部网络访问内部网络的行为进 …...

机器学习练习
原文章添加链接描述...

算法通关村第十九关——最小路径和
LeetCode64. 给定一个包含非负整数的 m n 网格 grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 输入:grid[[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径1→3→1→1→1的总和最小。 public int minPath…...

Linux 访问进程地址空间函数 access_process_vm
文章目录 一、源码解析二、Linux内核 用途2.1 ptrace请求2.2 进程的命令行 参考资料 一、源码解析 /*** get_task_mm - acquire a reference to the tasks mm** Returns %NULL if the task has no mm. Checks PF_KTHREAD (meaning* this kernel workthread has transiently a…...

selenium 动态爬取页面使用教程以及使用案例
Selenium 介绍 概述 Selenium是一款功能强大的自动化Web浏览器交互工具。它可以模拟真实用户在网页上的操作,例如点击、滚动、输入等等。Selenium可以爬取其他库难以爬取的网站,特别是那些需要登录或使用JavaScript的网站。Selenium可以自动地从Web页面…...

小程序中如何查看会员的积分和变更记录
积分是会员卡的一个重要功能,可以用于激励会员消费和提升用户粘性。在小程序中,商家可以方便地查看会员卡的积分和变更记录,以便更好地了解会员的消费行为和积分变动情况。下面将介绍如何在小程序中查看会员卡的积分和变更记录。 1. 找到指…...

音视频 ffmpeg命令直播拉流推流
直播拉流 ffplay rtmp://server/live/streamName ffmpeg -i rtmp://server/live/streamName -c copy dump.flv对于不是rtmp的协议 -c copy要谨慎使用 直播推流 ffmpeg -re -i out.mp4 -c copy flvrtmp://server/live/streamName参数:-re,表示按时间戳读取文件 参…...

Python钢筋混凝土结构计算.pdf-T001-混凝土强度设计值
以下是使用Python求解上述问题的完整代码: # 输入参数 f_ck 35 # 混凝土的特征抗压强度(单位:MPa) f_cd 25 # 混凝土的强度设计值(单位:MPa) # 求解安全系数 gamma_c f_ck / f_cd # …...

长风破浪会有时,直挂云帆济沧海!(工作室年会总结)
前言 我也是有段时间没写过总结性的博客了。最近是很忙的,尤其是年会那两天,我甚至可以说这是我这辈子目前最忙的两天。但这段经历还是很值得我记录下来的,也是给后面有需要的人提供的一些建议。我个人也是第一次筹办这种大型些的活动&#x…...

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第五、六节:边界描述和矩描述
文章目录 一:边界描述(1)边界链码A:概述B:边界链码改进C:程序 (2)傅里叶描绘子A:概述B:程序 二:矩描述(1)矩A:…...

Redis之bigkey问题解读
目录 什么是bigkey? bigkey引发的问题 如何查找bigkey redis-cli --bigkeys MEMORY USAGE bigKey如何删除 渐进式删除 unlink bigKey生产调优 什么是bigkey? bigkey简单来说就是存储本身的key值空间太大,或者hash,list&…...

ElementUI浅尝辄止27:Steps 步骤条
引导用户按照流程完成任务的分步导航条,可根据实际应用场景设定步骤,步骤不得少于 2 步。 1.如何使用? 设置active属性,接受一个Number,表明步骤的 index,从 0 开始。需要定宽的步骤条时,设置s…...

React 18 迁移状态逻辑至 Reducer 中
参考文章 迁移状态逻辑至 Reducer 中 对于拥有许多状态更新逻辑的组件来说,过于分散的事件处理程序可能会令人不知所措。对于这种情况,可以将组件的所有状态更新逻辑整合到一个外部函数中,这个函数叫作 reducer。 使用 reducer 整合状态逻…...

【SA8295P 源码分析】89 - QNX AIS Camera qcarcam_test 可执行程序 main() 函数 源代码流程分析
【SA8295P 源码分析】89 - QNX AIS Camera qcarcam_test 可执行程序 main 函数 源代码流程分析 一、qcarcam_test.cpp main() 函数源码分析二、qcarcam_test_setup_input_ctxt_thread( ) :初始化 gCtxt.inputs[input_idx] 上下文环境三、process_cb_event_thread( ) :负责处理…...

STM32屏幕计时器
目录 一、最终效果二、实现思想三、实现过程3.1 屏幕显示3.2 中断处理 一、最终效果 显示屏显示计时时间,格式为 00:00:00,依次为 时:分:秒,程序运行之后自动计时,当按下按键,计时清零,按下按键采用外部中…...

MRI多任务技术及应用
目录 一、定量心血管磁共振成像(CMR)的改进方法二、磁共振多任务三、磁共振多任务的成像框架四、磁共振多任务的图像模型和采样和重建策略五、利用MR多任务进行快速三维稳态CEST(ss-CEST)成像5.1 利用MR多任务进行快速三维稳态CEST(ss-CEST)成像介绍5.2 …...

app自动化测试(Android)
Capability 是一组键值对的集合(比如:"platformName": "Android")。Capability 主要用于通知 Appium 服务端建立 Session 需要的信息。客户端使用特定语言生成 Capabilities,最终会以 JSON 对象的形式发送给 …...

【力扣每日一题】2023.9.3 消灭怪物的最大数量
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目比较长,我概括一下就是有一群怪物,每只怪物离城市的距离都不一样,并且靠近的速度也不一样&#x…...

Python入门教程 | Python3 列表(List)
Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。 Python 有 6 个序列的内置类型,但最常见的是列表和元组。 列表都可以进…...

Java低代码开发:jvs-list(列表引擎)功能(一)配置说明
在低代码开发平台中,列表页是一个用于显示数据列表的页面。它通常用于展示数据库中的多条记录,并提供搜索、排序和筛选等功能,以方便用户对数据进行查找和浏览。 jvs-list是jvs快速开发平台的列表页的配置引擎,它和普通的crud 具…...

UI自动化之关键字驱动
关键字驱动框架:将每一条测试用例分成四个不同的部分 测试步骤(Test Step):一个测试步骤的描述或者是测试对象的一个操作说明测试步骤中的对象(Test Object):指页面的对象或者元素对象执行的动…...

前端高性能渲染 — 虚拟列表
虚拟列表,实际上就是在首屏加载的时候,只加载可视区域内需要的列表项,当滚动发生时,动态通过计算获得可视区域内的列表项,并将非可视区域内存在的列表项删除。该技术是解决渲染大量数据的一种解决方法。 实现虚拟列表&…...

防水出色的骨传导耳机,更适合户外运动,南卡Runner Pro 4S体验
已经接近尾声的夏季依然酷热,对于运动爱好者来说,这确实也是锻炼的好时机,无论是一会儿就能大汗淋漓的HIIT,还是是各种清凉的水上运动,在健身的同时,戴上一副耳机享受音乐,都会更加痛快一些。 相…...

docker快速安装-docker一键安装脚本
1.下载/配置安装脚本 touch install-docker.sh #!/bin/bash #mail:ratelcloudqq.com #system:centos7 #integration: docker-latestclear echo "######################################################" echo "# Auto Install Docker …...