sscanf 为什么不能识别 string

sscanf 为啥不能识别 string
运行环境是Dev C++ 5.4.1
不知为啥,运行之后程序就崩溃了。sscanf 为什么不能识别 string何解?
代码如下:

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

int main(int argc, char** argv) 
{
int a,b;
char c[100];
string cc;

//sscanf("11 22 abc","%d %d %s",&a,&b,c);
sscanf("11 22 abc","%d %d %s",&a,&b,&cc);

cout<<a<<":"<<b<<":"<<cc<<endl;
}
sscanf   string

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

cin的问题比scanf的问题多十倍不止!


请指出!

请教怎么用cin实现9楼功能的代码?


让你举出“十倍不止”的例证,你举不出来,又来炒冷饭。

你这个代码,即使一个C++初学者都知道如何用cin去实现,况且你这里还存在一个认知错误,在C++中与sscanf对应的是串流stringstream,不是cin,不过,既然你提到用cin去实现,那么就用cin实现吧。对于C++的IOSTREAM来说,也可以轻而易举地做到。实现的方法很多,我至少可以举出下面四种,但代码我只提供其中一种,偶没这么多功夫逐个写代码,其它的你自己去弄,如果你搞不清楚如何实现,那就算了。

第一种:

std::stringbuf origin( std::ios_base::in );
origin.str( "   137 ab 687ab3868 " );
std::streambuf* oldBuf = std::cin.rdbuf( &origin );
int example;
std::ios_base::iostate flag;
std::cin.unsetf( std::ios_base::skipws );
do
{
    flag = ( std::cin >> example ).rdstate();
    if( !( flag & std::ios_base::failbit ) )
    {
        std::cout << "input = " << example << std::endl;
    }
    else if( !( flag & std::ios_base::eofbit ) )
    {
        std::cin.clear();
        std::cout << "skipchar : " << "'" << static_cast< char > ( std::cin.get() ) << "'" << std::endl;
    }
}
while( !( flag & std::ios_base::eofbit ) );
std::cin.rdbuf( oldBuf );


第二种,自定义一个带参数的操作符,在操作符内通过stringstream逐步解析传入的c风格字符串,例如:
cin >> from_str( "34679 96798 df 9697" );

第三种,利用流缓冲迭代器,例如istreambuf_iterator< char >( std::cin )或者istreambuf_iterator< char >( &origin ),直接通过迭代器运算实现;

第四种,也自定义一个带参数的操作符,但内部实现可以完全复制9楼的代码,就是一个简单地用cin进行的封装,因为9楼的代码也同样是C++代码!


最后,来而不往非礼也,也请你像偶这样,在不改变scanf抽象标记的情况下(偶没改变cin的抽象标记),使用scanf解决楼主的问题,让scanf支持string!
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

cin的问题比scanf的问题多十倍不止!


请指出!

请教怎么用cin实现9楼功能的代码?


让你举出“十倍不止”的例证,你举不出来,又来炒冷饭。

你这个代码,即使一个C++初学者都知道如何用cin去实现,况且你这里还存在一个认知错误,在C++中与sscanf对应的是串流stringstream,不是cin,不过,既然你提到用cin去实现,那么就用cin实现吧。对于C++的IOSTREAM来说,也可以轻而易举地做到。实现的方法很多,我至少可以举出下面四种,但代码我只提供其中一种,偶没这么多功夫逐个写代码,其它的你自己去弄,如果你搞不清楚如何实现,那就算了。

第一种:

std::stringbuf origin( std::ios_base::in );
origin.str( "   137 ab 687ab3868 " );
std::streambuf* oldBuf = std::cin.rdbuf( &origin );
int example;
std::ios_base::iostate flag;
std::cin.unsetf( std::ios_base::skipws );
do
{
    flag = ( std::cin >> example ).rdstate();
    if( !( flag & std::ios_base::failbit ) )
    {
        std::cout << "input = " << example << std::endl;
    }
    else if( !( flag & std::ios_base::eofbit ) )
    {
        std::cin.clear();
        std::cout << "skipchar : " << "'" << static_cast< char > ( std::cin.get() ) << "'" << std::endl;
    }
}
while( !( flag & std::ios_base::eofbit ) );
std::cin.rdbuf( oldBuf );