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 |