今天在QQ群中有人问起这两个问题,我只是在oneNote中做过笔记,也不是很熟,只不过oneNote的搜索功能太难用了。觉得这些基本功问题还是要熟悉才好。
首先是格式转换,什么浮点数转换为字符串,字符串转换为浮点数,建议使用C++ 的字符处理类,stringstream,在exceptional C++中好像说过sprintf什么的不是很安全。下面来看例子:
#include <sstream>
#include <iostream>
using namespace std;
int main()
stringstream ss;
double a = 3.141592;
double b;
string r;
ss << a;
ss >> r;
cout << r << endl;
ss.clear();//注意使用多个转换的话,在中间要使用clear()
ss << r;
ss >> b;
cout << b << endl;
return 0;
}
stringstream很好用,但是sscanf和sprintf在很多地方也很有用,来看几个简单的例子。
int a, b, c
sscanf("2012:05:17", "%d:%d:%d", &a, &b, &c);
上面的例子将年月日分别读入到 a , b ,c 中保存起来。
当然也可以这样:
sscanf("2012-05-17", "%d-%d-%d", &a, &b, &c);
效果是一样的。
对于sscanf还可以使用正则表达式进行匹配:
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
当输入:
sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
printf("%s\n",buf);
结果为:123456
sprintf函数的定义如下:
int sprintf( char *buffer, const char *format [, argument] ... );
通过sprintf函数可以将后面的变长参数按照format的格式打印到buffer中,不失为一种格式转换的利器。
char s[20];
sprintf(s, "%f", 3.1415926);
printf("%s\n",s)
结果为:3.141593
还可以指定宽度:
sprintf(s, "%10.3f", 3.1415626);
printf("%s\n",s)
结果为:3.142
这种情况也不在话下:
sprintf(s, "%d", 123);
printf("%s\n",s)
结果为:123