2012-09-30 222 views
1

我正在嘗試使用fgets()從一個文件中讀取一行。 讀完這一行之後,我想把這條線分開,並將它製成較小的字符串。 根據行中的第一個單詞,我讀入的行可以有3-5個由空格分隔的較小字符串。正在掃描字符串字符串

實施例: 行:除去蘋果12345 字符串1:除去 字符串2:蘋果 STRING3:12345

行:加番茄紅葉 字符串1:添加 字符串2:番茄 STRING3:紅色 串,4:葉

從上面的例子中,如果第一字符串是刪除,我需要閱讀其他2個字符串(蘋果,12345)。 如果第一個字符串是加,我需要讀其他3個字符串(番茄,紅色,葉)。

反正是有,我可以決定的次數閱讀並做到這一點使用sscanf的?

while(fgets(buf, sizeof buf, course_file) != NULL){ 
    sscanf(buf, "%s", &string1); 
    printf("%s\n", buf); 
} 

這不是強制性的,我使用sscanf,我願意接受其他建議。

+0

我不清楚你的意思通過「決定閱讀的次數」。 – CrazyCasta

+0

對不起。讓我們來做一個精確的例子。如果第一個單詞是刪除,我需要創建3個令牌(刪除,蘋果,12345),如果第一個單詞是添加,我需要創建4個令牌(添加,番茄,紅色,葉)。 – rlhh

回答

1

常用來標記字符串的函數是strtok,但它不是線程安全的;應該使用其現代版本strtok_r

開始令牌化在第一次調用buf,檢查第一個記號,然後進入依賴於第一令牌的內容幾個循環的一個:

while(fgets(buf, sizeof buf, course_file) != NULL) { 
    char *saveptr; 
    char *tok = strtok_r(buf, " ", &saveptr); 
    if (!strcmp(tok, "delete")) { 
     for (int i = 0 ; i != 3 ; i++) { 
      tok = strtok_r(NULL, " ", &saveptr); 
      // Do something with the token... 
     } 
    } else if (!strcmp(tok, "add")) { 
     for (int i = 0 ; i != 4 ; i++) { 
      tok = strtok_r(NULL, " ", &saveptr); 
      // Do something else with the token... 
     } 
    } else { 
     // Error 
    } 
} 
+0

無論如何,我可以向前看,知道我是否真的讀過所有參數/迷你弦?我很擔心,因爲我需要處理一個姓名字段,可以是名字,中間名和姓氏的任意組合。 – rlhh

+0

@ user1043625您可以根據您看到的當前令牌使您的令牌化邏輯繼續或停止。我的意思是,如果你找到一個特定的標記,或者當標記流盡早結束時,你可以使用'while'來代替'for'循環,或者跳出循環。 – dasblinkenlight

+0

嗯,沒關係。想知道是否有方法可以將指針提取到strtok_r的當前位置。 – rlhh