如何提升wordpress网站在惠州市惠城区建设局官网的可见度?
摘要:wordpress网站500,惠州市惠城区建设局网站,广州开发区新兴产业投资基金管理有限公司,大良网站建设更好的阅读体验huge{color{red}{更好的阅读体验}}更好的阅读体验 文章目录0. 叠甲,
wordpress网站500,惠州市惠城区建设局网站,广州开发区新兴产业投资基金管理有限公司,大良网站建设更好的阅读体验\huge{\color{red}{更好的阅读体验}}更好的阅读体验 文章目录0. 叠甲#xff0c;过1. 谈谈输入输出缓冲区1.1 基本概念输入输出流标准输入输出流文件输入输出流1.2 输入输出缓冲区什么是输入输出缓冲区#xff1f;为什么要设置输入输出缓冲区#xff1f;C/C 的…更好的阅读体验\huge{\color{red}{更好的阅读体验}}更好的阅读体验 文章目录0. 叠甲过1. 谈谈输入输出缓冲区1.1 基本概念输入输出流标准输入输出流文件输入输出流1.2 输入输出缓冲区什么是输入输出缓冲区为什么要设置输入输出缓冲区C/C 的输入输出缓冲区有何不同别急别急别急急急急急急急2. 谈谈输入输出的方式2.1 C/C 的输入和输出scanf() 和 printf()cin 和 coutgetchar() 和 getline()stringstream2.2 关闭 C 标准流同步3. 最后的练习3.1 泛凯撒加密3.2 题解0. 叠甲过 本人水平有限语言组织能力低下不保证绝佳的阅读体验也不保证内容完全准确如有错误和建议欢迎指出。才怪。 1. 谈谈输入输出缓冲区 1.1 基本概念 你先别急我知道你很急但是别急所以你先别急。
在了解输入输出输出缓冲区时需要明确以下几个基本概念
输入输出流标准输入输出流文件输入输出流 输入输出流 输入输出流是一种数据传输的概念。构成计算机的其中之一部件为 I/O 设备指的是用于从程序内部向外部设备屏幕、打印机等或从外部设备向程序内部传输数据的设备鼠标、键盘等计算机中通过 I/O 设备进行与用户之间的数据交互而为了适应不同的设备之间数据的传输提出了输入输出流的概念。即输入输出流就是一种统一的数据输入输出协议为不同的设备之间传递数据时提供一致的接口。 标准输入输出流 标准输入输出流是指程序与外部设备例如键盘和显示器之间的输入输出在 C 语言中 在 C 标准库中标准输入流输出流分别是 stdin 和 stdout另外还有标准错误流 stderr。使用 stdio.h 头文件里的 scanf() 函数和 printf() 函数。 在 C 语言中 在 C 标准库中没有 stdin 这样的标准输入流而是使用 std::cin 和 std::out 来进行标准输入和标准输出。使用 iostream.h 头文件里的 getline() 函数或是 和 操作符。 综上在 C 中输入输出流的使用通常是通过 iostream 库实现的而在 C 中则是通过 stdio 库实现的。 文件输入输出流 文件输入输出流则是将数据保存在磁盘上的文件中通过打开和关闭文件程序可以使用文件输入输出流进行数据的读取和写入。在 C 语言中 文件输入输出流使用 C 标准库中的文件指针 FILE* 来实现。操作函数有 fopen(), fclose(), fread(), fwrite() 等。 在 C 语言中 文件输入输出流是基于 C 标准库中的文件操作函数封装而成即 fstream 类。具体地通过 std::ifstream 和 std::ofstream 类实现它们是 std::istream 和 std::ostream 类的派生类。
相比标准输入输出流文件输入输出流需要显式地指定要读写的文件因此使用起来比较繁琐但也更加灵活文件输入输出流可以处理任何类型的文件包括文本文件和二进制文件而标准输入输出流只能处理字符流。此外文件输入输出流可以通过随机访问文件的方式读写文件而标准输入输出流只能顺序读写。 1.2 输入输出缓冲区 什么是输入输出缓冲区 顾名思义输入输出缓冲区就是输入输出缓冲的区域。
在 C/C 中输入输出缓冲区是用来存储输入输出数据的临时存储区域
输入缓冲区是在数据流输入之前存储输入数据的临时存储区域。输出缓冲区是在数据流输出之前存储输出数据的临时存储区域。
说人话输入输出缓冲区就是为了保存这些输入输出流而临时开辟出的一块内存。 为什么要设置输入输出缓冲区 众嗦粥汁因为需要所以设置
缓冲区是在内存中而外设则是在硬件中。相比于从硬件中读取和写入数据从内存中读取和写入数据更加快速。
因此当程序需要读取或写入大量数据时使用缓冲区可以将这些数据先存储到内存中然后再一次性地写入或读取避免了频繁访问硬件的开销。此外缓冲区还可以优化数据的排列和格式以便更高效地读取和写入数据。
说人话缓冲区的存在是为了提高输入输出效率减少对外设的访问次数。 C/C 的输入输出缓冲区有何不同 别急别急别急 首先别急其次别急所以我们先来了解下**输入输出缓冲区的空间由什么来分配开辟在哪里何时开辟**这个问题
输入输出缓冲区的空间通常由操作系统来分配的一般情况下是在程序运行时从内存中分配的在程序运行空间中分配的不是在操作系统的内核空间中分配而分配的时机和分配的空间大小会根据具体的实现而不同一般地当程序通过输入输出函数向缓冲区写入或者读取数据时缓冲区就会被分配。
具体地 分配缓冲区的时机 对于标准输入输出流缓冲区的空间通常是在程序启动时预先分配好的。对于文件输入输出流缓冲区的空间是在文件流和流缓冲区对象创建时动态分配的这些对象通常是在程序开始时被初始化的。缓冲区的大小通常是由实现细节所决定的但是一般来说缓冲区的大小应该足够容纳输入或输出数据的常规大小同时又不能过大以致于浪费内存。 分配缓冲区的大小 缓冲区的大小应该足够容纳输入或输出数据的常规大小同时又不能过大以致于浪费内存。 由实现库来完成对缓冲区大小的分配具体实现细节可能会因编译器或操作系统的不同而有所差异。 一般来说实现库会通过调用操作系统提供的系统调用或动态内存分配函数来分配缓冲区的空间。 在内存空间紧张的情况下缓冲区的大小可能会被限制从而可能影响到程序的性能和可靠性。 急急急急急急 我知道你急了但是你先别急这部分其实不用太纠结。的。对吧
在 C 语言中标准输入输出库 stdio.h 提供了输入输出缓冲区的实现。 主要使用了三个函数setbuf()setvbuf()fflush()。其中setbuf() 和 setvbuf() 可以用来设置缓冲区而 fflush() 用来清空缓冲区并把缓冲区中的数据输出到文件。因此C 中的输入输出函数如 scanf() 和 printf() 等是非类型安全的 它们依赖于格式化字符串来指示输入/输出数据的类型。如果格式化字符串不正确就会导致不可预测的结果如缓冲区溢出和未定义的行为。 在 C 中iostream 库提供了输入输出缓冲区的实现。 提供了两种不同的缓冲区streambuf 和 filebuf。streambuf 是 iostream 库的基类提供了对输入输出缓冲区的访问而 filebuf 是 fstream 库的基类提供了对文件输入输出缓冲区的访问。但是iostream 库还提供了一些类似 setbuf()setvbuf()flush() 等函数用来管理输入输出缓冲区。在关闭同步流之后iostream 库使用了一种不同于标准输入输出库的机制来提高效率例如使用字符串流 stringstream 和缓冲流 buffer stream 等。因此C 中的输入输出函数如 std::cin 和 std::cout 等是类型安全的 它们使用类型安全的 C 流语义其中数据类型是静态确定的而不是动态确定的。这意味着数据类型在编译时就已经确定而不是在运行时根据格式化字符串动态确定。这种静态类型检查可以在编译时检测到类型不匹配的错误从而使 C 的输入输出更加类型安全。
这就是为什么你仍然可以在 C 中使用 scanf() 和 printf()但是仍建议在 C 中使用 iostream 库所提供的标准输入输出的原因以及为什么我们常说 C 比 C 更适于面向对象。
总结这部分真的不用太纠结。中肯的。正确的。理智的。一针见血的。真的。 2. 谈谈输入输出的方式 2.1 C/C 的输入和输出 你急了你急了你急了因为你很迷你不明白 stdin、scanf、cin、std::cin、getline、stringstream 还有 stdout、printf、cout、std::cout 这些都是什么寄吧玩意对吧再来明确一下
stdin 是 C 语言中的标准输入流。cin 是 C 中的标准输入流而 std::cin 是 C 标准库命名空间中的标准输入流cin 是使用命名空间 std 的缩写即cin 是 std::cin 的别名。scanf() 是 C 语言中的输入函数而 cin 和 std::cin 是 C 中的输入流。scanf() 的参数需要使用格式化字符串来指定输入数据的类型而 cin 和 std::cin 可以自动识别输入数据的类型。getline() 是 C 中的输入函数可以用于从输入流中读取一行文本数据可以指定分隔符。getline() 可以替代 scanf() 和 cin 用于读取字符串类型数据。stdout 是 C 语言中的标准输出流。cout 是 C 中的标准输出流而 std::cout 是 C 标准库命名空间中的标准输出流。它们之间的区别同 cin 和 std::cin。printf() 是 C 语言中的输出函数而 cout 和 std::cout 是 C 中的输出流。printf() 的参数需要使用格式化字符串来指定输出数据的类型而 cout 和 std::cout 可以自动识别输出数据的类型。至于 stringstream 这个逼东西我们放到最后细嗦。 scanf() 和 printf() 因为我们对这两个东西再熟悉不过了所以我们对这两个东西根本不陌生这俩是 C 语言中的标准输入和标准输出函数。
对于 printf()只需要注意下面几点
用法scanf(format, argument_list);用于向控制台输出数据可以输出多种类型的数据如整数、浮点数、字符、字符串等。在输出字符串时需要注意字符串中是否包含特殊字符如换行符、制表符等需要使用相应的转义字符来表示。可以使用格式化输出来控制输出的格式如输出精度、对齐方式等。
而对于 scanf()除了基本注意点
用法scanf(format, argument_list);用于从控制台输入数据可以读取多种类型的数据如整数、浮点数、字符、字符串等。scanf() 输入数据时要求数据格式与 format 字符串中指定的格式匹配否则会产生错误。
还需要注意scanf() 函数的缓冲区不会自动清空因此需要使用fflush(stdin)语句清空缓冲区以防止输入的数据被下一个输入函数接收如果仅仅为了处理掉换行符 \n可以使用 getchar() 读取将换行符“吃掉”。
举个栗子
观察下列代码
#include stdio.hint main(){int n; //声明 int 类型变量 nscanf(%d, n); //读入 int 类型变量 nprintf(%d\n, n); //输出 int 类型变量 n 并且换行char c getchar(); //读入一个字符并存储在 char 类型变量 c 中printf(%c, c); //输出 char 类型变量 cprintf(14\n); //输出 14 并且换行return 0;
}假设运行并且在控制台输入如下内容
114
5理论上我期望得到输出
114
514但实际上控制台哼哼哼啊啊啊输出了如下内容
11414甚至控制台根本就没有接收你后续输入的 5 这个字符。
在该例子中scanf(%d, n)会读取输入流中的数字 114并将其存储在变量 n 中。但是由于输入缓冲区中还有一个换行符 \ngetchar()函数会读取这个换行符并存储在变量 c 中导致产生了这样的结果。在缓冲区中的数据没有被自动清空这就是为什么控制台根本没有鸟你后续输入的东西并输出了不符合预期的内容。
那么继续观察如下代码
#include stdio.hint main(){int n; //声明 int 类型变量 nscanf(%d, n); //读入 int 类型变量 nprintf(%d\n, n); //输出 int 类型变量 n 并且换行getchar(); //用 getchar() 吃掉缓冲区中的 \nchar c getchar(); //读入一个字符并存储在 char 类型变量 c 中printf(%c, c); //输出 char 类型变量 cprintf(14\n); //输出 14 并且换行return 0;
}重新编译运行并在控制台输入如下内容
114
5可以发现控制台哼哼哼啊啊啊输出了
114
514在该例子中为了避免上述缓冲区没有清空的情况我们在读取完数据后手动清空输入缓冲区利用 getchar() 读取了缓冲区里的换行符 \n使得后续的字符 5 被成功读入最终输出了符合预期的内容。 cin 和 cout cin 和 cout 是 C 的输入输出流可以使用它们来实现控制台的输入输出操作。一般地使用 cin 和 cout 时可以通过引入 using namespace std; 简化代码但也可以不引入命名空间使用完整限定名 std::cin 和 std::cout。
由于 cin 和 cout 的输入输出会自动匹配对应数据类型所以针对这两者的格式化输入输出并非此处讨论的重点而在此处我们需要提及其关于**同步流synchronized stream**的概念
同步流意味着在程序流中输出数据时程序必须等到数据完全输出到设备上然后才能继续执行后面的代码。同样当程序尝试从输入设备读取数据时程序会等待用户输入完整的数据然后才能继续执行后面的代码。
虽然同步流可以确保输入输出的正确性但是在一些场景下会影响程序的效率特别是在大量数据输入输出的情况下。
这就是为什么即使 C 宁愿舍弃 scanf() 和 printf() 的高性能也要得到输入输出流同步所带来的安全性和正确性这也使得 C 更适合面向对象开发。 getchar() 和 getline() 把这两个放一起存粹是因为他们长得很像但是两者天差地别 getchar()函数从标准输入stdin中读取一个字符返回该字符的 ASCII 码值。 通常用于读取单个字符或者字符数组可以实现简单的输入操作。 使用时需要注意的是由于输入的字符是直接通过键盘输入的因此需要按下回车键才能将输入的字符送入缓冲区此时getchar()才能够读取到输入的内容。 getline()函数从输入流中读取一行文本并将其存储到一个字符串对象中可以读取包含空格在内的一整行输入。 使用时需要注意的是如果使用默认的分隔符 \ngetline() 会将换行符读取到缓冲区如果下一次使用 getline() 读取输入就会导致缓冲区中的换行符被读取而不是期望的输入。此时可以通过调用cin.ignore()来清除缓冲区中的字符或者指定其他分隔符。
关于 getchar() 缓冲区的问题已经讲过下面举个 getline() 的栗子
观察下列代码
#include iostream
#include stringusing namespace std;int main() {string s; getline(cin, s); //读入 string 类型 scout First: s endl; //输出 sgetline(cin, s); //在此读入cout Second: s endl; //再次输出 sreturn 0;
}假设运行并且在控制台输入如下内容
114
514理论上我期望得到输出
First: 114
Second: 514但实际上控制台哼哼哼啊啊啊输出了如下内容
First: 114
Second: 514你会惊讶地发现符合期望然后你想“诶这不是没毛病垃圾 LysLysLys 玩我呢”
你先别急让我先急。
getline() 其参数实际上有三个第三个参数为分隔符参数即 getline() 会以该参数分割处理数据默认缺省该参数的情况下getline() 会以 \n 为分隔符即默认我们使用的是 getline(cin, s, \n);。
那么在该例子中输入 114 后按下回车键该回车键被视为一个分隔符并从输入流中删除此时 \n 仍然留在缓冲区中 。然后第二个 getline() 调用会读取缓冲区中剩余的字符即 \n514将其中的 \n 删除并存储 514。因此输出符合预期。
我们重新指定一下 getline() 的分隔符修改得到如下代码
#include iostream
#include stringusing namespace std;int main() {string s; getline(cin, s, ,); //读入 string 类型 s并以 , 为分隔符cout First: s endl; //输出 sgetline(cin, s, ,); //在此读入cout Second: s endl; //再次输出 s并以 , 为分隔符return 0;
}假设运行并且在控制台输入如下内容
114,
514,理论上我期望得到输出
First: 114
Second: 514但实际上控制台哼哼哼啊啊啊输出了如下内容
First: 114
Second:
514你会惊讶地发现这次不符合期望了然后你想“诶这不废话吗垃圾 LysLysLys 玩我呢”
你急了但是你先别急。
在该例子中输入 114, 后按下回车键, 则被视为了一个分隔符并从输入流中删除但后续输入的 \n 保留在了缓冲区中 。然后第二个 getline() 调用会读取缓冲区中剩余的字符即 \n514,将其中的 , 删除并存储 \n514。因此输出了不符合预期的内容。
为了避免这种结果我们同样需要手动清空缓存区可以使用 getchar() “吃掉”缓冲区中的 \n但更建议使用如下方法
#include iostream
#include stringusing namespace std;int main() {string s; getline(cin, s, ,); //读入 string 类型 scout First: s endl; //输出 s// 使用 cin.ignore() 忽略掉输入缓冲区中的换行符// 也可以使用 cin.get() 读取缓冲区中的换行符cin.ignore();// cin.get();getline(cin, s, ,); //在此读入cout Second: s endl; //再次输出 sreturn 0;
}最终得到了符合预期的结果。
First: 114
Second: 514总体而言getchar()适用于读取单个字符或者字符数组而getline()适用于读取一整行文本两者使用时需要注意不同的输入方式和缓冲区处理。 stringstream stringstream 是 C 标准库提供的一种数据流对象用于在内存中对字符串进行输入输出操作。它可以像 cin 和 cout 一样进行输入输出并且具有和输入输出流相似的接口和方法例如 和 操作符。它提供了将一个字符串转换成一个数据类型的方法方便程序员进行数据处理。在 C 中stringstream 也是类型安全的。
stringstream 和 cin、cout 等输入输出流都有类似的接口和方法可以进行输入输出操作但它们的作用域不同。cin、cout 等输入输出流通常用于标准输入输出流而 stringstream 通常用于字符串的处理。
通常我们可以使用 stringstream 对字符串进行分割、转换、拼接等操作然后再使用 cin 或 cout 输出到标准输入输出流中
我们可以使用 getline() 函数从标准输入读取一行字符串然后使用 stringstream 将其转换为数值类型最后再使用 cout 输出到标准输出流中。这样的代码既可以处理标准输入输出流又可以方便地进行字符串操作提高了程序的可扩展性和复用性。
举个栗子
观察如下代码
#include iostream
#include string
#include sstreamusing namespace std;int main() {stringstream s;string name Lys;int age 13;double height 1.86;string status is a dog;s Name: name , Age: age , Height: height , Status: status;string str s.str();cout str endl;return 0;
}在这个示例中我们首先创建了一个 stringstream 对象 s然后使用运算符将字符串、整数和浮点数和一个字符串插入到 s 中最后使用 str() 方法将所有插入的数据转换为一个字符串并将其打印到标准输出中。
再比如观察如下代码
#include iostream
#include string
#include sstreamusing namespace std;int main() {string s;getline(cin, s);stringstream ss(s);string str;while(ss str){cout str endl;}return 0;
}编译运行并且在控制台输入如下内容
Lys is a dog.然后得到如下输出
Lys
is
a
dog.在这个示例中我们首先创建了一个 string 类型的 s并用 getline(cin, s) 读入字符串然后将字符串 s 转换为了stringstream 对象 ss再通过该对象过滤空格后不断赋值给 str最终将其打印到标准输出中。 2.2 关闭 C 标准流同步 前面提到了由于 cin 和 cout 的同步流机制因此在性能上 scanf() 和 printf() 输入输出的效率显著优于 cin 和 cout但我们仍然可以通过设置 cin 和 cout 的同步流标志位来关闭同步流从而提高程序的效率甚至优于 scanf() 和 printf()。
在 C 程序中添加如下语句以优化输入输出流速度和交互性 ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);ios::sync_with_stdio(false)关闭 C 的标准输入输出流与 C 语言输入输出流的同步从而加快输入输出的速度。cin.tie(nullptr)解除 cin 和 cout 的绑定从而避免在读取输入时每次输出缓存区都被刷新的问题。cout.tie(nullptr)解除 cout 和 cin 的绑定从而避免在输出时每次读取输入都会刷新输出缓存区的问题。
需要注意的是关闭输入输出流同步后不能再在 C 代码中使用 C 语言的输入输出函数了否则可能会导致输出不完整或者输出顺序错误等问题。此外解除绑定后需要手动刷新输出缓存区否则输出的内容可能不完整或者不及时。因此在使用这些语句时需要谨慎地考虑使用场景和执行顺序避免出现不可预料的错误。
下列语句 ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);同样可以达到提高输入输出速度的目的。这种写法比使用 nullptr 更加通用因为在某些旧的 C 编译器中可能不支持 nullptr。
总的来说这两种写法的区别并不大只是在解除绑定时所使用的空指针常量不同但都可以实现提高输入输出速度的效果。 3. 最后的练习 3.1 泛凯撒加密 Original Link
描述
众所周知在网络安全中分为明文和密文凯撒加密是将一篇明文中所有的英文字母都向后移动三位ZZZ 的下一位是 AAA比如 aaa 向后移动三位就变成了 dddAAA 向后移动三位就变成了 DDDZZZ 向后移动三位就变成了 CCC但是泛凯撒加密可没有这么简单它是将明文中的每个字母向后移动k位得到密文并且在密文的结尾会附加一个 ?本题想让你通过得到密文反解出原本的明文。
输入格式
第一行输入一个正整数 kkk 表示字母向后移动的位数。
接下来输入若干行字符串表示密文数据输入保证仅密文的最后一个字符是 ?。
输出格式
输出原本的明文。
数据范围
0≤k≤1000 \le k \le 1000≤k≤100。 3.2 题解 你已经是一个成熟的 ACMer \text{ ACMer } ACMer 了要学会自己分析并解决问题。实在解决不了就解决自己吧。
#include iostream
#include cstringusing namespace std;void solve(){int k; cin k;string s;k % 26;getchar(); //清空缓冲区中的 \nwhile(getline(cin, s)){for(int i 0; i s.size(); i ){char st s[i];if(st a st z) cout char(st - k a ? st - k 26 : st - k);else if(st A st Z) cout char(st - k A ? st - k 26 : st - k);else if(st ?) break;else cout st;}cout endl;}
}int main(){solve();return 0;
}
