如何给网站添加音乐,恩施网站制作,网站建设后帐号密码,网站为什么被降权前言#xff1a; 以前没有接触过stringstream这个类的时候#xff0c;常用的字符串和数字转换函数就是sscanf和sprintf函数。开始的时候就觉得这两个函数应经很叼了#xff0c;但是毕竟是属于c的。c中引入了流的概念#xff0c;通过流来实现字符串和数字的转换方便多了。在… 前言 以前没有接触过stringstream这个类的时候常用的字符串和数字转换函数就是sscanf和sprintf函数。开始的时候就觉得这两个函数应经很叼了但是毕竟是属于c的。c中引入了流的概念通过流来实现字符串和数字的转换方便多了。在这里总结之前的并介绍新学的。 常见格式串: %% 印出百分比符号不转换。 %c 整数转成对应的 ASCII 字元。 %d 整数转成十进位。 %f 倍精确度数字转成浮点数。 %o 整数转成八进位。 %s 整数转成字符串。 %x 整数转成小写十六进位。 %X 整数转成大写十六进位。 %n sscanf(str, %d%n, dig, n)%n表示一共转换了多少位的字符 sprintf函数 sprintf函数原型为 int sprintf(char *str, const char *format, ...)。作用是格式化字符串具体功能如下所示 1将数字变量转换为字符串。 2得到整型变量的16进制和8进制字符串。 3连接多个字符串。 int main(){char str[256] { 0 };int data 1024;//将data转换为字符串sprintf(str,%d,data);//获取data的十六进制sprintf(str,0x%X,data);//获取data的八进制sprintf(str,0%o,data);const char *s1 Hello;const char *s2 World;//连接字符串s1和s2sprintf(str,%s %s,s1,s2);coutstrendl; return 0;
} sscanf函数 sscanf函数原型为int sscanf(const char *str, const char *format, ...)。将参数str的字符串根据参数format字符串来转换并格式化数据转换后的结果存于对应的参数内。具体功能如下 1根据格式从字符串中提取数据。如从字符串中取出整数、浮点数和字符串等。 2取指定长度的字符串 3取到指定字符为止的字符串 4取仅包含指定字符集的字符串 5取到指定字符集为止的字符串 当然sscanf可以支持格式串%[]形式的有兴趣的可以研究一下。 int main(){char s[15] 123.432,432;int n;double f1;int f2;sscanf(s, %lf,%d%n, f1, f2, n);coutf1 f2 n;return 0;
} 输出结果123.432 432 11 即一共转换了11位的字符。 stringstream类 sstream库定义了三种类istringstream、ostringstream和stringstream分别用来进行流的输入、输出和输入输出操作。 1.stringstream::str(); returns a string object with a copy of the current contents of the stream. 2.stringstream::str (const string s); sets s as the contents of the stream, discarding any previous contents. 3.stringstream清空stringstream s; s.str(); 4.实现任意类型的转换 templatetypename out_type, typename in_value out_type convert(const in_value t){ stringstream stream; streamt;//向流中传值 out_type result;//这里存储转换结果 streamresult;//向result中写入值 return result; } int main(){string s 1 23 # 4;stringstream ss;sss;while(sss){coutsendl;int val convertint(s);coutvalendl;}return 0;
} 输出1 1 23 23 # 0 4 4 顺便说一下今天做题的时候也用到了stringstream这个类是二叉树的序列化和反序列化。 题目链接http://www.lintcode.com/zh-cn/problem/binary-tree-serialization/ 二叉树的序列化和反序列化 设计一个算法并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”读取文件后重建同样的二叉树被称为“反序列化”。如何反序列化或序列化二叉树是没有限制的你只需要确保可以将二叉树序列化为一个字符串并且可以将字符串反序列化为原来的树结构。 思路 通过先序遍历建立二叉树的序列化其中空子树用#来表示。反序列化的时候呢遇到#就停止递归构造。另外序列化的时候是将整数通过stringstream转换成字符串反序列化是将字符串通过stringstream转换成整数。 /*** Definition of TreeNode:* class TreeNode {* public:* int val;* TreeNode *left, *right;* TreeNode(int val) {* this-val val;* this-left this-right NULL;* }* }*/
class Solution {
public:/*** This method will be invoked first, you should design your own algorithm * to serialize a binary tree which denote by a root node to a string which* can be easily deserialized by your own deserialize method later.*/bool first;templatetypename out_type, typename in_valueout_type convert(const in_value t){stringstream stream;streamt;//向流中传值out_type result;//这里存储转换结果streamresult;//向result中写入值return result;}void pre_order(TreeNode *root, string s){if(root){string tmp convertstring(root-val);if(!first)s tmp;else {first false;stmp;}pre_order(root-left, s);pre_order(root-right, s);} else {if(first)s#;else {first false;s #;}}}string serialize(TreeNode *root) {// write your code herestring s;first true;pre_order(root, s);//先序实现序列化return s;}stringstream ss;void buildT(TreeNode * T){string s;sss;if(s #) return ;int val convertint(s);T new TreeNode(val);buildT(T-left);buildT(T-right);}/*** This method will be invoked second, the argument data is what exactly* you serialized at method serialize, that means the data is not given by* system, its given by your own serialize method. So the format of data is* designed by yourself, and deserialize it here as you serialize it in * serialize method.*/TreeNode *deserialize(string data) {// write your code hereTreeNode *T NULL;ss.str();ssdata;buildT(T);return T;}
}; 转载于:https://www.cnblogs.com/hujunzheng/p/5042068.html