当前位置: 首页 > news >正文

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 的概念

计算机中的输入和输出,简称 \color{}I/O,其中:

  • \color{}I 代表 Input,即输入。
  • \color{}O 代表 Output,即输出。

 IO 是指计算机系统与外部世界进行信息交流和数据传输的过程。

输入是指将外部信息引入计算机系统,而输出是将计算机系统处理后的信息传递回外部世界。

其本质是 计算机与外部世界之间的信息交流和数据传输过程。

0x01 标准 I/O 流

 C 语言中标准 I/O 流为 stdinstdout

它们分别用于标准输入和标准输出,stdin 就是输入,可以从键盘读取用户输入的内容,

 再利用 stdout 输出将结果打印到屏幕上,

(对于 stdin 和 stdout 的具体知识点我们将通过 printf 和 scanf 函数来展开讲解)

I/O 流的存在,使得 C 程序可以与用户进行交互,并通过控制台窗口进行输入和输出。

值得一提的是,在标准 C 库中,stdinstdout 是已经定义好的流,无需额外的设置或配置。

此外,还有一个标准错误流 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

&#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; ​—— 热门专栏《维生素C语言》的重制版 —— &#x1f4ad; 写在前面&#xff1a;这是一套 C 语言趣味教学专栏&#xff0c;目前正在火热连载中&#xff0c;欢迎猛戳订阅&#…...

如何将home目录空间扩充到根目录下

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

Ceph PG Peering数据修复

ceph数据修复 当PG完成了Peering过程后&#xff0c;处于Active状态的PG就可以对外提供服务了。如果该PG的各个副本上有不一致的对象&#xff0c;就需要进行修复。 Ceph的修复过程有两种&#xff1a;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临时清华源和豆瓣源 配环境的一点小问题 我们尽量是去配置能满足代码的环境&#xff0c;而不要想着修改…...

Kafka3.0.0版本——文件存储机制

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

Linux如何安装MySQL

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

确保网络的安全技术介绍

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

机器学习练习

原文章添加链接描述...

算法通关村第十九关——最小路径和

LeetCode64. 给定一个包含非负整数的 m n 网格 grid,请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 输入&#xff1a;grid[[1,3,1],[1,5,1],[4,2,1]] 输出&#xff1a;7 解释&#xff1a;因为路径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浏览器交互工具。它可以模拟真实用户在网页上的操作&#xff0c;例如点击、滚动、输入等等。Selenium可以爬取其他库难以爬取的网站&#xff0c;特别是那些需要登录或使用JavaScript的网站。Selenium可以自动地从Web页面…...

小程序中如何查看会员的积分和变更记录

​积分是会员卡的一个重要功能&#xff0c;可以用于激励会员消费和提升用户粘性。在小程序中&#xff0c;商家可以方便地查看会员卡的积分和变更记录&#xff0c;以便更好地了解会员的消费行为和积分变动情况。下面将介绍如何在小程序中查看会员卡的积分和变更记录。 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参数&#xff1a;-re,表示按时间戳读取文件 参…...

Python钢筋混凝土结构计算.pdf-T001-混凝土强度设计值

以下是使用Python求解上述问题的完整代码&#xff1a; # 输入参数 f_ck 35 # 混凝土的特征抗压强度&#xff08;单位&#xff1a;MPa&#xff09; f_cd 25 # 混凝土的强度设计值&#xff08;单位&#xff1a;MPa&#xff09; # 求解安全系数 gamma_c f_ck / f_cd # …...

长风破浪会有时,直挂云帆济沧海!(工作室年会总结)

前言 我也是有段时间没写过总结性的博客了。最近是很忙的&#xff0c;尤其是年会那两天&#xff0c;我甚至可以说这是我这辈子目前最忙的两天。但这段经历还是很值得我记录下来的&#xff0c;也是给后面有需要的人提供的一些建议。我个人也是第一次筹办这种大型些的活动&#x…...

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第五、六节:边界描述和矩描述

文章目录 一&#xff1a;边界描述&#xff08;1&#xff09;边界链码A&#xff1a;概述B&#xff1a;边界链码改进C&#xff1a;程序 &#xff08;2&#xff09;傅里叶描绘子A&#xff1a;概述B&#xff1a;程序 二&#xff1a;矩描述&#xff08;1&#xff09;矩A&#xff1a;…...

Redis之bigkey问题解读

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

ElementUI浅尝辄止27:Steps 步骤条

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

React 18 迁移状态逻辑至 Reducer 中

参考文章 迁移状态逻辑至 Reducer 中 对于拥有许多状态更新逻辑的组件来说&#xff0c;过于分散的事件处理程序可能会令人不知所措。对于这种情况&#xff0c;可以将组件的所有状态更新逻辑整合到一个外部函数中&#xff0c;这个函数叫作 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( ) :负责处理…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...