2011-02-25 34 views
1

有人能帮助我理解这一段代码:C++:sscanf的行为

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

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

所以像

"Hello world, 100000" 

字符串变为

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

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

+0

谢谢。这解释了预期的行为。 – Shree 2011-02-25 08:22:55

2

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

从代码中,我可以说为什么p增加的原因是因为最初p的第一个字符被分配了\0。所以它会递增到下一个字符,使其指向一个整数值,以便sscanf可以用%ld指定符来读取它。在此之后,sscanf会读取带有%s说明符的字符串。

+0

编写代码的人需要一些关于向他的代码添加注释和关于幻数的教程。 (页数:今天看到Nawaz获得金牌,恭喜Nawaz!:)) – Nav 2011-02-25 07:32:28

+0

@Nav:谢谢。顺便说一句,你是怎么知道我今天拿到金牌的? – Nawaz 2011-02-25 09:16:51

+0

主页显示最近获得的徽章列表。也许不是'今天',而是'最近'。 – Nav 2011-02-25 10:53:50