2013-04-17 130 views
3

我討厭成爲那個提出簡單問題的人,但我在C中有點生疏,而且有什麼東西在這裏躲過我。我想讀一個文件,下面的示例文本:C解析一個字符串劃分

23# 1110.00:1000.00,120.00:1110.00,1190.00:900.00,-52.98,-53.21 

我想在幾個字符串分隔由紅衣主教和昏迷分的元素,但是在我的控制檯我沒有得到任何輸出中的。

#include <stdio.h> /* required for file operations */ 
    #include <conio.h> /* for clrscr */ 
    #include <dos.h> /* for delay */ 

    FILE *fr;   /* declare the file pointer */ 

    #include <stdio.h> 
    int main(void) 
    { 
     char output[200]; 
     const char filename[] = "file.txt"; 
     FILE *file = fopen(filename, "r"); 
     if (file) 
     { 
      char line [ BUFSIZ ]; 
      while (fgets(line, sizeof line, file)) 
      { printf(" %s \n", line); 

       char * i[80],pt1[80], pt2[80], pt3[80], tp1[80], tp2[80]; 
       if (sscanf(line, "%s# %s,%s,%s,%s,%s", 
         &i, &pt1, &pt2, &pt3, &tp1, &tp2) == 6) 
       { 
        snprintf(output, sizeof output, 
          "Leitura:=%s,PT1=%s,PT2=%s,PT3=%s,TP1=%s,TP2=%s,", 
          i, pt1, pt2, pt3, tp1, tp2); 
        puts(output); 
       } 
      } 
     } 
     else 
     { 
      perror(filename); 
     } 
     return 0; 
    } 

回答

6

的問題是,sscanf()不會把#,作爲分隔符,只有空白。這意味着"%s"將完全讀取"1110.00:1000.00,120.00:1110.00,1190.00:900.00,-52.98,-53.21",從而導致可能的緩衝區溢出,並且肯定不會導致6

一種解決方案是使用掃描集:因爲它使陣列

char * i[80],pt1[80], pt2[80], pt3[80], tp1[80], tp2[80]; 

if (sscanf(line, 
      "%79[^#]# %79[^,],%79[^,],%79[^,],%79[^,],%s", 
      i, 
      pt1, 
      pt2, 
      pt3, 
      tp1, 
      tp2) == 6) 

此外,的i聲明是不正確的。更改爲:

char i[80],pt1[80], pt2[80], pt3[80], tp1[80], tp2[80];