2011-02-25 60 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