2015-09-06 69 views
0

我想從文本文件(在命令行中指定爲參數的名稱)的某些詞語(在此示例中爲前20)中讀取它。由於下面的代碼運行,我發現它也帶有帶有字符的標點符號。fscanf()僅讀入沒有標點符號的字符

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

int main(int argc, char * argv[]){ 
int wordCap = 20; 
int wordc = 0; 
char** ptr = (char **) calloc (wordCap, sizeof(char*)); 
FILE *myFile = fopen (argv[1], "r"); 
if (!myFile) return 1; 
rewind(myFile); 
for (wordc = 0; wordc < wordCap; wordc++){ 
    ptr[wordc] = (char *)malloc(30 * sizeof(char)); 
    fscanf(myFile, "%s", ptr[wordc]); 
    int length = strlen(ptr[wordc]); 
    ptr[wordc][length] = '\0'; 
    printf("word[%d] is %s\n", wordc, ptr[wordc]); 
} 
return 0; 
} 

當我穿過了一句:「有一次,當獅子睡着了一點點鼠標就開始和看不起他跑起來;」,「他」將用分號接踵而至。

我將fscanf()更改爲fscanf(myFile, "[a-z | A-Z]", ptr[wordc]);,它將整個句子作爲單詞。

我怎樣才能改變它,使正確的輸出?

+0

您指定的掃描集接受小寫字母,大寫字母,空格和管道符號。不要包括空白,特別是;你並不是真的想要這個管道,儘管它會損失很少。不要忘記,你必須使用別的東西來讀取終止掃描集的字符。 –

回答

1

你可以接受分號,然後將其刪除後,像這樣:

你存儲的字PTR [wordc]後:

i = 0; 
while (i < strlen(ptr[wordc])) 
{ 
    if (strchr(".;,!?", ptr[wordc][i])) //add any char you wanna delete to that string 
     memmove(&ptr[wordc][i], &ptr[wordc][i + 1], strlen(ptr[wordc]) - i); 
    else 
     i++; 
} 
if (strlen(ptr[wordc]) > 0) // to not print any word that was just punctuations beforehand 
    printf("word[%d] is %s\n", wordc, ptr[wordc]); 

我沒有測試過這代碼,所以可能存在拼寫錯誤或其他內容。

或者你可以爲

fscanf(myFile, "%29[a-zA-Z]%*[^a-zA-Z]", ptr[wordc]); 

只捕獲字母切換

fscanf(myFile, "%s", ptr[wordc]); 

。 29限制字的大小,所以你不會溢出,因爲你只分配了30個字符的大小

+0

謝謝。這絕對是一種策略,但我正在尋找替代'%s'的行,或者一個證明它不可行的答案。 – jsh6303

+0

@JiajuShen我加了一些信息 – dietbacon