2012-11-30 43 views
1

我想分割一行使用strtok其中有選項卡分隔符。我的代碼和輸入如下。我想將這些標記存儲到field1,field2,field3中。使用strtok函數刪除Tab空間

代碼:

while(fgets(line,80,fp1)!=NULL) //Reading each line from file to calculate the file size. 
{ 
    field1=strtok(line," "); 
    //field1=strtok(NULL,""); 
    field2=strtok(NULL," "); 
    field3=strtok(NULL," "); 
    if(flag != 0) 
    printf("%s",field1); 
    flag++; 
} 

輸入:

315  316  0.013 
315  317  0.022 
316  317  0.028 
316  318  0.113 
316  319  0.133 
318  319  0.051 
320  324  0.054 
321  322  0.054 

我的電流輸出:(如果我打印字段1)

315  316  0.013 
315  317  0.022 
316  317  0.028 
316  318  0.113 
316  319  0.133 
318  319  0.051 
320  324  0.054 
321  322  0.054 

回答

1

我會建議使用sscanf。它爲您處理製表符作爲分隔符。

#include <stdio.h> 
#include <stdlib.h> 

int 
main() 
{ 
    char line[80], field1[32], field2[32], field3[32]; 
    FILE *fp; 

    fp = fopen("testfile", "r"); 
    if (fp == NULL) { 
      printf("Could not open testfile\n"); 
      exit(0); 
    } 

    while (fgets(line, sizeof(line), fp) != NULL) { 
      sscanf(line, "%s%s%s", field1, field2, field3); 
      printf("%s %s %s\n", field1, field2, field3); 
    } 

    exit(0); 
} 
+0

爲了避免潛在的緩衝區溢出,您應該定義'field1'和朋友與同尺寸的'line'或通過長度說明符是這樣的:'sscanf的(行,「%31S 31S%31S%」, field1,field2,field3);'。您還應該檢查'sscanf()'的返回值,以避免將未初始化的數據傳遞給'printf()'。 – chqrlie

1

看看此處的信息:

http://www.cplusplus.com/reference/cstring/strtok/ 

您將空格指定爲用作標記器的分隔符,但您的字符串沒有空格(對我來說,這看起來像是製表符)。所以,strtok所做的是從一開始就開始尋找tab(「\ t」)。它一直持續到字符串末尾,並且沒有找到它,但它確實在末尾找到\ 0,所以它在開始時返回字符串,因爲strtok總是在要找到的標記之前給出字符串。

將分隔符更改爲「\ t」,然後打印每個字段變量。

2
while(fgets(line,80,fp1)!=NULL) //Reading each line from file to calculate the file size. 
{ 
    char *p; 

    p = strtok(line, '\t'); 
    int itr = 0; 
    while(p != NULL) { 
     if(itr == 0){ 
      strcpy(field1, p); 
      itr++; 
     } 
     else if(itr == 1){ 
      strcpy(field2, p); 
      itr++; 
     } 
     else { 
      strcpy(field3, p); 
      itr = 0; 
     } 
    p = strtok(NULL, '\t'); 
    } 
    printf("%s%s%s", field1, field2, field3); 
    // store it in array if needed   
}