2013-04-13 70 views
3

我正在打開文本文件,並且只想閱讀字母表中的字詞。 因此,例如,如果我有一個「Hello-World嘿」的文本文件。我想閱讀「你好」,「世界」,「嘿」等字。僅閱讀字母字符 - C

問題是我不知道什麼「格式說明符」應該是這個輸出。我試過了無數組合,但都沒有按照希望工作。

FILE *fpin; 
char str[50]; 

while (fscanf(fpin, "%s[a-zA-Z]", str) != EOF) { 
    // do something with str 
} 

任何幫助將不勝感激!謝謝。

+0

嚴重的是,誰繼續告訴C新手scanf是一個好主意? – kay

+0

@Kay我是C新手,什麼是更好的選擇,爲什麼scanf是一個壞主意? (我意識到這個問題聽起來是對抗的,但我其實很想知道) – NickO

+1

@Kay教授,書籍,...,如果使用得當,功能很強大。 – 2013-04-14 00:17:01

回答

6

你快到了;應該使用掃描集,但掃描集也沒有s轉換。

while (fscanf(fpin, "%49[a-zA-Z]", str) == 1) { 

49防止緩衝區溢出(並且是的,它必須小於數組的維度)。

當然,這適用於第一個單詞;然後你需要跳過非單詞字符,所以你可能有:

while (fscanf(fpin, "%49[a-zA-Z]", str) == 1) 
{ 
    ...do something with word in str... 
    if (fscanf(fpin, "%49[^a-zA-Z]", str) != 1) 
     ...decide what to do... 
     ...but remember one problem might be that the 'word' was too long... 
} 
+0

很好,謝謝! – mason

2

我對自己編程相當新,但也許這就是你要找的。 希望它有幫助。

#include <ctype.h> 

int i = 0; 
FILE *fpin; 
char c, str[50]; 

while ((c = fgetc(fpin)) != EOF) 
{ 
    if(isalpha(c)) 
     str[i++] = c; 

} 
str[i] = '\0'; 
// do something with str 
+1

這是錯誤的,用char檢查EOF,而不是null終止數組。 – 2013-04-14 00:19:32

+0

請記住,'fgetc()'及其親屬返回一個'int',而不是'char'。這是因爲他們必須識別256個可能的字符值(假設8位'char'類型)和一個不同的值EOF。如果'char'是無符號的,那麼你的EOF測試永遠不會是真的(當EOF發生時你不會發現)。如果'char'被簽名,那麼你會在一些有效的字符上錯誤地檢測到EOF,通常是ÿ,y-變音符號,U + 00FF,LATIN小字符Y,帶有DIAERESIS,0xFF。 –

+0

@Jonathan Leffler fgetc有一個廣泛的變體叫做fgetwc(而WEOF代替EOF)。雖然我不確定這是你的想法。我在我的機器上試過這個,它似乎工作得很好。無論如何,你有超過20萬代表 - 我的知識很難與你的相媲美。 – Venom