2014-10-17 73 views
0

我想從文本文件中讀取非數字字,它可以用逗號,點,冒號或引號或這樣的一些組合來分隔「。到目前爲止,在讀非數字的話 正確,但使用的fscanf離開delimiters.Am我()吧?使用fscanf()的格式化輸入

int ReadWords(FILE* fp, char *words[]) 
{ 
    int i=0; 
    char temp[50],tmp[50]; // assuming the words cannot be too long 
    while (fscanf(fp,"%s%*[,.\":]",temp)==1) //ignore punctuation 
    { 
     if (isNumeric(temp)) 
      continue; 
     printf("%s\n",temp); 
     words[i] = strdup(temp); 
     i++; 
    } 
    fclose(fp); 
    // The result of this function is the number of words in the file 
    return i; 
} 

我越來越像輸出

emergency," 
"an 
unknown 
car 
entered, 

我需要一個像

emergency 
an 
unknown 
car 
entered 
+0

請更新您的問題標題,以便更具體地瞭解您要區分的輸入類型。 – 2014-10-17 06:59:28

回答

1

%s格式掃描 「字」,即,連續的非空間塊。這包括標點符號。

您想掃描非數字字,即僅字母字符。您可以使用%[...]格式,你已經爲標點符號做,這些字符:

while (fscanf(fp, "%49[a-zA-Z]%*[^a-zA-Z]", temp) == 1) ... 

注意事項:

  • 減號定義括號字符的範圍,除非它是第一個或最後一個字符,所以%[a-zA-Z]掃描不帶拉丁字母的字母。
  • 我已經在格式中添加了最大字長49,所以你不會溢出字符緩衝區。
  • 我將除字母之外的任何內容視爲標點符號。這是一個簡單的假設,但它將輸入整齊地分爲字母/標點符號序列。您可以將您希望包含的字母作爲括號內的第一個字母否定字母^
  • 您應該首先對標點符號進行掃描(可能爲空),以便真正的掃描以字母開頭。
+0

謝謝..這實際上解決了我對項目的另一個困惑。 – Stormbringer 2014-10-17 07:04:11

0

原因是你在使用ignore子句之前正在使用標點符號。

嘗試:"%[^,.\":]%*[,.\":]"

+0

不應該在某處存在字符串說明符嗎? – Stormbringer 2014-10-17 06:40:40

+0

@Stormbringer這個,有兩個 - '%['是一個字符串說明符。 – o11c 2014-10-17 06:42:55