sscanf和sstream的使用

  sscanf是一个运行时函数,原形很简单: 
int sscanf( 
const char *buffer, 
     const char *format [, 
   argument ... 
); 
它强大的功能体现在对format的支持,以及类型转换上。
其中的format可以是一个或多个 {%[*] [width] [{h I64 L}]type          '\t' '\n' 非%符号}, 
注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
 
width:宽度,一般可以忽略,用法如: 
const    char sourceStr[] "hello, world"; 
char buf[10] {0}; 
sscanf(sourceStr, "%5s", buf);     //%5s,只取5个字符 
cout << buf<< endl; 
结果为:hello 

{h I64 L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。 

type :这就很多了,就是%s,%d之类。 
特别的: 

%*[width] [{h I64 L}]type    表示满足该条件的被过滤掉,不会向目标参数中写入值。如: 
const    char sourceStr[] "hello, world"; 
char buf[10] {0}; 
sscanf(sourceStr, "%*s%s", buf);     //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了 
cout << buf<< endl; 
结果为:world 

支持集合操作: 
      %[a-z]    表示匹配a到z中任意字符,贪婪性(尽可能多的匹配) 
      %[aB']    匹配a、B、'中一员,贪婪性 
      %[^a]     匹配非a的任意字符,贪婪性 
例:
给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中:
  sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
  printf("%s\n", buf);  结果为:12DDWDFF

sscanf可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。 


 stringstream,顾名思义,就是字符串的输入输出流,跟fstream很相似。 
 需包含头文件:#include <sstream> 

 

stringstream通常是用来做数据转换的。相比c库的转换,它更加安全,自动和直接。
例子一:基本数据类型转换例子 int转string
#include <string>
#include <sstream>
#include <iostream>
int main()
{
    std::stringstream stream;
    std::string result;
    int i = 1000;
    stream << i; //将int输入流
    stream >> result; //从stream中抽取前面插入的int值
    std::cout << result << std::endl; // print the string "1000"
}
运行结果:print the string "1000"

例子二:除了基本类型的转换,也支持char *的转换。
#include <sstream>
#include <iostream>
int main()
{
    std::stringstream stream;
    char result[8] ;
    stream << 8888; //向stream中插入8888
    stream >> result; //抽取stream中的值到result
    std::cout << result << std::endl; // 屏幕显示 "8888"
}
屏幕显示 "8888"

例子三:再进行多次转换的时候,必须调用stringstream的成员函数clear().
#include <sstream>
#include <iostream>
int main()
{
    std::stringstream stream;
    int first, second;
    stream<< "456"; //插入字符串
    stream >> first; //转换成int
    std::cout << first << std::endl;
    stream.clear(); //在进行多次转换前,必须清除stream
    stream << true; //插入bool值
    stream >> second; //提取出int
    std::cout << second << std::endl;
}
运行clear的结果:
456
1
没有运行clear的结果:
456
8800090900 

 注意stringstream和sscanf的区别: 

 

        如果str[] = "one two three four"; 

 

        如果按照这么读: char word[20][20]; for(i = 0; i < n; i++)sscanf(str, "%s", word[i]);   

 

        那么你读入的每一个word[i]都是单词"one",而用stringstream则是将这几个单词依次读入。 

 

        原因很简单,stringstream是对一个确定的字符串进行操作,内部有一个指针标记读到哪了,而sscanf则每次都是从头对str进行读入。 

 

        虽然在ACM中不推荐使用C++中的输入输出流,但小数据量的题目偶尔为之,还是能大大提高写代码的速度和准确率的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值