2013-02-17 124 views
2

我已經開始學習如何使用字符串,但是我對整個概念有點困惑。我試圖從包含字符串的文件逐字讀取。使用C的字符串分隔符

以下是文件:

Row, row, row your boat, 
Gently down the stream. 
Merrily, merrily, merrily, merrily, 
Life is but a dream. 

我的方法是使用

char hold[25]; 

// Statement 
while(fscanf(fpRow, "%s", hold) != EOF) 
    printf("%s %d\n", hold, strlen(hold)); 

所以,我的任務是讀取每個字符串,並排除所有的,和。在文件中。爲此,該方法將使用%[^ ,.]而不是%s正確嗎?但是當我嘗試這種方法時,我的字符串只想讀取文件的第一個單詞,循環永遠不會退出。有人可以向我解釋我做錯了什麼嗎?另外,如果問fscanf和fgets之間的意義是不是太大了?由於

while(fscanf(fpRow, "%24[^,.\n ]", hold) != EOF) 
{ 
    fscanf(fpRow, "%*c", hold); 
    printf("%s %d\n", hold, strlen(hold)); 
} 
+0

你的意思是'fgetc()'?這隻能讀取一個字符,而'fscanf()'可以讀取更多,也可以轉換爲其他數據類型。 – 2013-02-17 22:55:05

+0

我總是希望使用'fgets'來獲得一整行,並在循環中單獨處理它。它確定你最終可以進入FEOF;如果你沒有完成掃描一行,我不知道'fscanf'會爲你自己表現,如果你沒有用格式說明符來到行尾...... – Floris 2013-02-17 22:57:34

+0

@ Code-Guru-啊,對不起,它應該是'fgets'。對不起,我現在編輯它。 – Nathan 2013-02-17 23:04:54

回答

4

是,%[^,. ]應該工作 - 但請記住,當你這樣做,就會停止閱讀時遇到的任何這些字符。然後您需要在輸入緩衝區中讀取該字符,然後再嘗試讀取另一個字。

另外請注意,當您使用%s%[...],你想指定緩衝區的長度,或者你最終的東西基本上是喜歡gets,其中從用戶輸入錯誤可/會導致緩衝區溢出。

+3

男人,我做了很多C編程已經有一段時間了。從什麼時候scanf()使用正則表達式? – 2013-02-17 22:53:29

+1

'%* [^ ,. ]'會「跳過」任何匹配的內容,所以你不需要將它讀入一個變量中...... – Floris 2013-02-17 22:53:30

+1

@ Code-Guru - 參見http://stackoverflow.com/questions/5999164/is-scanfs-regex- support-a-standard – Floris 2013-02-17 22:55:16