c++ 浮点数精确度控制,sprintf()
| 0 1 2 3 4 5 | char  buf[100]; int a = 10; sprintf(buf,  "%.2f", double(a)); // 精度 2 double b = 123.4561; sprintf(buf, "%.2f", b); // 精度 2 sprintf(buf, "%.3f", b); // 精度 3 | 
c++ 浮点数精确度控制,sprintf()
| 0 1 2 3 4 5 | char  buf[100]; int a = 10; sprintf(buf,  "%.2f", double(a)); // 精度 2 double b = 123.4561; sprintf(buf, "%.2f", b); // 精度 2 sprintf(buf, "%.3f", b); // 精度 3 | 
gmp随机数实例,gmp生成随机数
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <iostream> #include <cstring> #include <ctime> #include <gmpxx.h> int main() {     clock_t time = clock();     gmp_randstate_t grt;     gmp_randinit_default(grt);  // 初始化随机数变量     gmp_randseed_ui(grt, time); // 种子赋值     mpz_t key;     mpz_init(key); // 初始化整数     // 生成0到 (2^n)-1(含)范围内的均匀分布的随机整数 。     mpz_urandomb(key, grt, 16);     gmp_printf("-- 16 bit:\t%Zd\n", key);     // 释放占用的内存空间     gmp_randclear(grt);     mpz_clear(key);     /**      * 输出:         -- 16 bit:      23086      */ } | 
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include <iostream> #include <cstring> #include <ctime> #include <gmpxx.h> int main() {     // 有时为正整数,有时为负整数     mpz_class ran;     gmp_randclass rr(gmp_randinit_default);     rr.seed(std::time(nullptr));     ran = rr.get_z_bits(125);     long int _random = ran.get_ui();     printf("-- 125 bit:\t%d\n", _random);     ran = rr.get_z_bits(256);     _random = ran.get_ui();     printf("-- 256 bit:\t%d\n", _random);     ran = rr.get_z_bits(512);     _random = ran.get_ui();     printf("-- 512 bit:\t%d\n", _random);     ran = rr.get_z_bits(1024);     _random = ran.get_ui();     printf("-- 1024 bit:\t%d\n", _random);     /**      * 输出:         -- 125 bit:     1227284511         -- 256 bit:     -840074903         -- 512 bit:     -1613957681         -- 1024 bit:    1234011535      */ } | 
c/c++,gmp库,gmp浮点数
gmp官方给出了接口说明,但是缺少实例,所以还是不能把gmp很好的利用。于是在网上查找gmp相关实例,查到的都是关于整数的,而且是早形参根本对不上,应该是早期的版本。这不是我想要的,而且我要研究的是浮点数。
gmp中文相关的文章太少了,查到的也都是关于gmp整数的实例,而且有些测试还不能通过。
求人不如求己,那就自己反复做各种测试,反复的看官方相关文档吧。
其实反复的测试,反复的看官方文档,确实有效。
gmp版本:
MSYS2的安装与使用及MinGW64安装配置
MSYS2是工具和库的集合,为您提供了一个易于使用的环境,用于构建,安装和运行本机Windows软件。
它由一个名为mintty的命令行终端 ,bash,git和subversion之类的版本控制系统,tar和awk之类的工具,甚至是autotools之类的构建系统,全部基于Cygwin的修改版。尽管其中一些中心部分基于Cygwin,但MSYS2的主要重点是为本机Windows软件提供构建环境,并使使用Cygwin的部分最少。MSYS2为GCC,mingw-w64,CPython,CMake,Meson,OpenSSL,FFmpeg,Rust,Ruby等提供了最新的本机版本。
为了提供易于安装的软件包并保持更新状态,它具有一个名为Pacman的软件包管理系统,Arch Linux用户应该熟悉该系统 。它带来了许多强大的功能,例如依赖性解析和简单的完整系统升级,以及直接且可复制的程序包构建。我们的软件包存储库包含2000多个预安装的软件包,可供安装。
cygwin命令,cygwin找不到的命令在这里
clear
clear包含在 ncurses 包中,直接从默认源安装即可。
ncurses 是一个基于终端界面开发 类GUI应用程序 的库。
xgettext,msginit,msgfmt
这几个命令属于 gettext_devel 包,用于生成pot/po文件,以及编译po到mo格式。
aclocal
aclocal在 automake 包中,默认源中包含。
autoreconf
autoreconf在 autoconf 包中,默认源中包含。
telnet
安装 xinetd 和 inetutils 包即可,默认源中包含。
TI-RPC客户端服务端接口实例,cygwin libtirpc,
参数传递
TI-RPC允许将单个参数从客户端传递到服务器。如果需要多个参数,则可以将这些组件组合成一个被视为单个元素的结构。从服务器传递到客户端的信息作为函数的返回值传递。无法通过参数列表将信息从服务器传递回客户端。
捆绑
客户必须知道如何联系服务。两个必要的方面是找出服务器所在的主机,然后连接到实际的服务器进程。在每个主机上,一个名为rpcbind的服务管理RPC服务。TI-RPC使用可用的主机命名服务(例如主机文件,NIS +和DNS)来查找主机。
传输协议
传输协议指定如何在客户端和服务器之间传输呼叫消息和回复消息。TS-RPC使用TCP和UDP作为传输协议,但是TI-RPC的当前版本与传输无关,因此可以与任何传输协议一起使用。
呼叫语义
调用语义定义了客户端可以对远程过程的执行承担什么;特别是该过程执行了多少次。这些语义对于处理错误条件很重要。这三种选择分别是一次,最多一次和 至少一次。ONC +提供至少一次语义。远程调用的过程是幂等的:每次调用它们都应返回相同的结果,即使经过多次迭代也是如此。
数据表示
数据表示形式描述了参数和结果在流程之间传递时所使用的格式。为了在各种系统体系结构上起作用,RPC需要标准的数据表示形式。TI-RPC使用外部数据表示(XDR)。XDR是与机器无关的数据描述和编码协议。使用XDR,RPC可以处理任意数据结构,而不管不同主机的字节顺序或结构布局约定如何。有关XDR的详细讨论,请参见附录A,XDR技术说明和附录C,XDR协议规范。 Continue reading 
gdb调试命令及基本使用姿势,C/C++调试工具gdb的基本使用姿势,linux下gdb调试,gdb调试工具,gdb调试命令,gdb调试教程,gdb调试实例
run:(简写 r) ,其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。
continue (简写c ):继续执行,到下一个断点处(或运行结束)
next:(简写 n),单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同 step 的主要区别是,step 遇到用户自定义的函数,将步进到函数中去运行,而 next 则直接调用函数,不会进入到函数体内。
step (简写 s):单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的
until:(简写 u)当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
until+行号: 运行至某行,不仅仅用来跳出循环
finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。
call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55)
quit:(简写 q) ,退出gdb Continue reading 
C++ cygwin环境测试JSON库报错:cannot find -ljson
这么写报错:
| 0 1 2 | $ g++ t_json.cpp -l json -o t_json.exe /usr/lib/gcc/x86_64-pc-cygwin/10/../../../../x86_64-pc-cygwin/bin/ld: cannot find -ljson collect2: error: ld returned 1 exit status | 
这么写还报错:
| 0 1 2 | $ g++ t_json.cpp -l json -I /usr/include -o t_json.exe /usr/lib/gcc/x86_64-pc-cygwin/10/../../../../x86_64-pc-cygwin/bin/ld: cannot find -ljson collect2: error: ld returned 1 exit status | 
就想不明白了,到根目录下的/lib文件夹看看
| 0 1 | $ ls /lib/*json* /lib/libjsoncpp.dll.a | 
恍然大悟呀,这会我才想起来,当初Cygwin Setup安装JSON库的时间,库的开发包名称就是libjsoncpp-devel,编译命令改为如下:
| 0 | $ g++ t_json.cpp -l jsoncpp -o t_json.exe | 
通畅了。
N个强大而实用的C/C++框架和库,C框架,C库,C第三方库,C++框架,C++库,C++第三方库
值得学习的C语言开源项目- 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。
下载链接:http://home.tiscali.cz/~cz210552/webbench.html
- 2. Tinyhttpdtinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。
下载链接:http://sourceforge.net/projects/tinyhttpd/
- 3. cJSONcJSON是C语言中的一个JSON编解码器,非常轻量级,C文件只有500多行,速度也非常理想。
cJSON也存在几个弱点,虽然功能不是非常强大,但cJSON的小身板和速度是最值得赞赏的。其代码被非常好地维护着,结构也简单易懂,可以作为一个非常好的C语言项目进行学习。
项目主页:http://sourceforge.net/projects/cjson/
- 4. CMockerycmockery是google发布的用于C单元测试的一个轻量级的框架。它很小巧,对其他开源包没有依赖,对被测试代码侵入性小。cmockery的源代码行数不到3K,你阅读一下will_return和mock的源代码就一目了然了。
主要特点: Continue reading 
std::string 二级分隔字符串,Cookie字符串分隔
分隔字符串的使用场景很多,所以一定要至少掌握一种适合自己的处理方法。c++中的std::string类,使用我们操作字符相对简单了很多。
下面实例是处理Cookie字符串的场景,源码如下:
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | /**  *   * @Author: mrdede <1234567@qq.com>  * @Blog: http://mrdede.com/  * @Time: 2021/1/7 13:32  *   */ #include <iostream> #include <cstring> int main() {     std::string cookieString = "user=mrdede; web=mrdede.com; email=1234567@qq.com";     std::cout << "字符串总数:\t" << cookieString.length() << std::endl;     int index = 0;     bool is_end = false;     std::string delim1 = "=";     std::string delim2 = "; ";     std::string tmp, key, value;     // it.operator->() 同 it.base(),剩余未读取的字符     for(std::string::iterator it = cookieString.begin(); it != cookieString.end(); it++) {         std::string str_tmp1, str_tmp2;         str_tmp1 = it.operator*();         str_tmp2 = it.operator[](1);         std::cout <<"\t"<< index << ":\t" << str_tmp1;         std::cout << "\t" << str_tmp2;         std::cout << "\t" << sizeof(str_tmp1);         std::cout << "\t" << sizeof(it.operator*());         std::cout <<"\t"<<it.base() << std::endl;         index++;         // is_end = true,表示现在是最后一个字符了         if(it+1 == cookieString.end()) is_end = true;         if(str_tmp1 == delim1) { // 获取 KEY             key = tmp;             tmp.clear();         } else if(str_tmp1 + str_tmp2 == delim2 || is_end) { // 获取 VALUE             if(is_end) {// 当前是最后一个字符了                 tmp += it.operator*();             } else { // 跳过下一个空格字符                 it++;             }             value = tmp;             // 插入业务处理逻辑             std::cout << "key: " << key <<", value: "<< value <<std::endl;             key.clear();             value.clear();             tmp.clear();         } else { // 连接字符串             tmp += it.operator*();         }     }     return 0; } | 
输出:
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | $ g++ main.cpp $ ./a.exe 字符串总数:     49         0:      u       s       8       1       user=mrdede; web=mrdede.com; email=1234567@qq.com         1:      s       e       8       1       ser=mrdede; web=mrdede.com; email=1234567@qq.com         2:      e       r       8       1       er=mrdede; web=mrdede.com; email=1234567@qq.com         3:      r       =       8       1       r=mrdede; web=mrdede.com; email=1234567@qq.com         4:      =       m       8       1       =mrdede; web=mrdede.com; email=1234567@qq.com         5:      m       r       8       1       mrdede; web=mrdede.com; email=1234567@qq.com         6:      r       d       8       1       rdede; web=mrdede.com; email=1234567@qq.com         7:      d       e       8       1       dede; web=mrdede.com; email=1234567@qq.com         8:      e       d       8       1       ede; web=mrdede.com; email=1234567@qq.com         9:      d       e       8       1       de; web=mrdede.com; email=1234567@qq.com         10:     e       ;       8       1       e; web=mrdede.com; email=1234567@qq.com         11:     ;               8       1       ; web=mrdede.com; email=1234567@qq.com key: user, value: mrdede         12:     w       e       8       1       web=mrdede.com; email=1234567@qq.com         13:     e       b       8       1       eb=mrdede.com; email=1234567@qq.com         14:     b       =       8       1       b=mrdede.com; email=1234567@qq.com         15:     =       m       8       1       =mrdede.com; email=1234567@qq.com         16:     m       r       8       1       mrdede.com; email=1234567@qq.com         17:     r       d       8       1       rdede.com; email=1234567@qq.com         18:     d       e       8       1       dede.com; email=1234567@qq.com         19:     e       d       8       1       ede.com; email=1234567@qq.com         20:     d       e       8       1       de.com; email=1234567@qq.com         21:     e       .       8       1       e.com; email=1234567@qq.com         22:     .       c       8       1       .com; email=1234567@qq.com         23:     c       o       8       1       com; email=1234567@qq.com         24:     o       m       8       1       om; email=1234567@qq.com         25:     m       ;       8       1       m; email=1234567@qq.com         26:     ;               8       1       ; email=1234567@qq.com key: web, value: mrdede.com         27:     e       m       8       1       email=1234567@qq.com         28:     m       a       8       1       mail=1234567@qq.com         29:     a       i       8       1       ail=1234567@qq.com         30:     i       l       8       1       il=1234567@qq.com         31:     l       =       8       1       l=1234567@qq.com         32:     =       3       8       1       =1234567@qq.com         33:     3       4       8       1       1234567@qq.com         34:     4       4       8       1       234567@qq.com         35:     4       4       8       1       34567@qq.com         36:     4       0       8       1       4567@qq.com         37:     0       5       8       1       567@qq.com         38:     5       6       8       1       67@qq.com         39:     6       @       8       1       7@qq.com         40:     @       q       8       1       @qq.com         41:     q       q       8       1       qq.com         42:     q       .       8       1       q.com         43:     .       c       8       1       .com         44:     c       o       8       1       com         45:     o       m       8       1       om         46:     m               8       1       m key: email, value: 1234567@qq.com |