C ++:sscanf行为

时间:2011-02-25 06:32:46

标签: c++ pointers scanf

有人可以帮我理解这段代码:

    char *line = new char[2048];
    char *probableCauseStr = new char[512];
    char *additioanl_text = new char[512];
    long holdPeriod = 0;

    while( !f.eof() ) {
            f.getline( line, 2048 );
            //
            // find the ',' seperator
            //
            char* p = StrMgt::strchr( line, ',' );
            if( !p ) continue;
            *p = '\0';
            p++;
            if( sscanf( line, "%s%s", probableCauseStr, additioanl_text ) != 1 || 
                sscanf( p, "%ld%s", &holdPeriod, additioanl_text ) != 1 ) continue;

            ....

我想弄清楚字符指针p会发生什么。

2 个答案:

答案 0 :(得分:2)

char指针p递增到下一个char,然后第二个sscanf从递增指针指向的内存位置读取数据。

从代码中,我可以说p增加的原因,因为最初p的第一个字符被赋予了\0。因此它会递增到下一个char,使其指向一个整数值,以便sscanf可以使用%ld说明符读取它。在此之后,sscanf将使用%s说明符读取字符串。

答案 1 :(得分:2)

p用于查找第一个逗号并将其替换为\0(这是C风格字符串的字符串结尾,特别是对于sscanf)。然后p递增以指向下一个字符。

所以像

这样的字符串
"Hello world, 100000"

变为

line -> "Hello world"
p -> " 100000"

然后尝试两个sscanfs,检查哪一个返回1(这意味着它正好解析了1个值)。在这个例子中,第一个sscanf会返回2(因为有两个单词),所以第二个将被调用,并返回1,holdPeriod得到值100000