cin是如何处理非whitespace分割的数据的?

visionfans 2014-03-17 09:51:47

int i;
string s;

cin >> i >> s;


输入如果是
引用
123abc

会读成i=123; s="abc"
这样是很合理,但是如果数据是
引用
123,abc

逗号是分隔符,也就不方便了

我的问题是向知道cin底层怎么决定给一个变量读多少数据的?
谢谢
...全文
176 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
visionfans 2014-03-19
  • 打赏
  • 举报
回复
引用 8 楼 supermegaboy 的回复:
[quote=引用 楼主 visionfans 的回复:] 我想跳过所有的,和-,怎么处理呢,不考虑正则表达式的前提下
你老停留在C风格的思维里头,在C++中这种行为不好。当然,你一定要用逗号和-作分隔符的话,cin也是可以做到的,需要修改cin的local对象中的ctype的space属性,即为cin增加自定义的分隔符,示例如下: …… [/code][/quote] “C风格的思维”是哪块?
飞天御剑流 2014-03-17
  • 打赏
  • 举报
回复
引用 楼主 visionfans 的回复:
我想跳过所有的,和-,怎么处理呢,不考虑正则表达式的前提下
你老停留在C风格的思维里头,在C++中这种行为不好。当然,你一定要用逗号和-作分隔符的话,cin也是可以做到的,需要修改cin的local对象中的ctype的space属性,即为cin增加自定义的分隔符,示例如下:

#include <iostream>
#include <string>
#include <locale>

class delimiter : public std::ctype<char>
{
public:

    delimiter( const std::string& characters )
        : std::ctype<char>( creatTable( characters ), false ){ }

private:

    std::ctype_base::mask const* creatTable( const std::string& characters )
    {
        std::ctype_base::mask* table = new std::ctype_base::mask[ std::ctype<char>::table_size ];
        std::fill_n( table, std::ctype<char>::table_size, std::ctype_base::mask( ) );
        for( std::string::size_type i = 0; i < characters.size( ); ++i )
        {
            table[ characters[ i ] ] = std::ctype_base::space;
        }
        return table;
    }
};

int main( void )
{
    delimiter delimiters( ",-" );
    std::cin.imbue( std::locale( std::locale( ), &delimiters ) );
    int a;
    std::string b;
    while ( std::cin >> a >> b )
    {
        std::cout << "a = " << a << std::endl
                  << "b = " << b << std::endl;
    }
    return 0;
}
mujiok2003 2014-03-17
  • 打赏
  • 举报
回复
引用 6 楼 visionfans 的回复:
[quote=引用 5 楼 mujiok2003 的回复:]

int i;
char sep;
std::string s;
std::cin >> i >.> >> s;
[quote=引用 4 楼 visionfans 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 整数:1. 跳过空格 2.一直读取直到遇到一个非有效的整数组成部分(比如空格,或者'V',EOF等) 字符串 1. 跳过空格 2 一直读取直到遇到空格或者EOF
感谢,后面那个一般的处理方法是不是用cin.ignore(10, ',');?[/quote][/quote] 是想说
std::cin >> i >> sep >> >> s;
吗? 这样处理不鲁棒吧。如果数据是
引用
123,,,abc
更或者
引用
123,,,---abc
我想跳过所有的,和-,怎么处理呢,不考虑正则表达式的前提下[/quote] yeah
visionfans 2014-03-17
  • 打赏
  • 举报
回复
引用 5 楼 mujiok2003 的回复:

int i;
char sep;
std::string s;
std::cin >> i >.> >> s;
[quote=引用 4 楼 visionfans 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 整数:1. 跳过空格 2.一直读取直到遇到一个非有效的整数组成部分(比如空格,或者'V',EOF等) 字符串 1. 跳过空格 2 一直读取直到遇到空格或者EOF
感谢,后面那个一般的处理方法是不是用cin.ignore(10, ',');?[/quote][/quote] 是想说
std::cin >> i >> sep >> >> s;
吗? 这样处理不鲁棒吧。如果数据是
引用
123,,,abc
更或者
引用
123,,,---abc
我想跳过所有的,和-,怎么处理呢,不考虑正则表达式的前提下
mujiok2003 2014-03-17
  • 打赏
  • 举报
回复

int i;
char sep;
std::string s;
std::cin >> i >.> >> s;
引用 4 楼 visionfans 的回复:
[quote=引用 1 楼 mujiok2003 的回复:] 整数:1. 跳过空格 2.一直读取直到遇到一个非有效的整数组成部分(比如空格,或者'V',EOF等) 字符串 1. 跳过空格 2 一直读取直到遇到空格或者EOF
感谢,后面那个一般的处理方法是不是用cin.ignore(10, ',');?[/quote]
visionfans 2014-03-17
  • 打赏
  • 举报
回复
引用 1 楼 mujiok2003 的回复:
整数:1. 跳过空格 2.一直读取直到遇到一个非有效的整数组成部分(比如空格,或者'V',EOF等) 字符串 1. 跳过空格 2 一直读取直到遇到空格或者EOF
感谢,后面那个一般的处理方法是不是用cin.ignore(10, ',');?
visionfans 2014-03-17
  • 打赏
  • 举报
回复
引用 2 楼 mujiok2003 的回复:
cin的源码是可以直接阅读的哦
源码可读是好事儿,但是STL的代码太。。。难读了。。。所以来发问
mujiok2003 2014-03-17
  • 打赏
  • 举报
回复
cin的源码是可以直接阅读的哦
mujiok2003 2014-03-17
  • 打赏
  • 举报
回复
整数:1. 跳过空格 2.一直读取直到遇到一个非有效的整数组成部分(比如空格,或者'V',EOF等) 字符串 1. 跳过空格 2 一直读取直到遇到空格或者EOF

64,631

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧