2014-02-08 68 views
0

所以這個任務是實現一個子串搜索程序,它使用一個輸入文件來搜索和一個輸入來搜索。我創建以下代碼:爲什麼不從2參數文件中讀取程序?

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

int main(int argc,char *argv[]) 
{ 
    FILE *fp; 
    fp = fopen(argv[1],"r"); 
    if (fp == NULL) 
    { 
     printf("Error"); 
     return 0; 
    } 
    char* tmpp[100]; 
    int count = 0; 
    char* nexts = argv[2]; 
    char* tmp = fgets(tmpp,100,fp); 
    while(tmp = strstr(tmp,nexts)) 
    { 
     count++; 
     tmp++; 
    } 
    printf("%d\n\n",count); 
    fclose(fp); 

    return 0; 
}  

的程序編譯,但是當我去實現它在Ubuntu終端爲:

echo "aabb" >beta 
./a.out beta a 
1 

爲什麼心不是使用第一個參數程序(的argv [1])作爲beta和第二個參數(argv [2])是否正確?

+2

您正在爲'tmp'指定'argv [1]',因此您正在尋找單詞'beta'中的字母'a'。聽起來好像你想從你用fopen打開的文件中讀取數據,所以你需要將這些數據「fread」到一個char數組中,並用'strstr'來搜索這個數據。 – Joe

+0

正如Joe所說,你需要從文件中讀取數據('fgets()'很可能是你的朋友),然後計算你從文件中讀取的字符。目前,您正在掃描文件名稱,而不是文件內容。 (嘗試'echo「xxyyzz」> omega; ./a.out omega z'。) –

+0

我該怎麼去做這件事?我是C新手,所以我不明白fread在這種情況下會如何工作? – user3288280

回答

0

你應該打開一個文件,然後從該文件到臨時緩衝區中讀取的字節:

FILE *file = fopen("file", "r"); 
while (1) { 
    char buffer[BUFSIZ+1]; 
    size_t nread = fread(buffer, 1, sizeof(buffer)-1, file); 
    if (nread == 0) break; // read error or EOF 
    buffer[nread] = 0; 

    // chunk with BUFSIZ amount of bytes is available via buffer (and is zero-terminated) 
} 

如果你想在一個文件中搜索字符串/模式,要知道,在文件中查找模式可能會在你塊大小的邊界,例如:你看「hello」,BUFSIZ是512.文件在字節510包含「hello」。顯然,如果你讀512,你會得到以「he」結尾的第一個塊,並且第二塊以「llo」開頭。對於所有塊大小,這種情況的概率不爲零(SIZE_MAX除外,但緩衝區大小由於其他原因是不可能的)。處理邊界可能非常複雜。

0

關閉......但是這是更接近:

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

int main(int argc, char *argv[]) 
{ 
    if (argc != 3) 
    { 
    fprintf(stderr, "Usage: %s file pattern\n", argv[0]); 
    return 1; 
    } 
    FILE *fp = fopen(argv[1], "r"); 
    if (fp == NULL) 
    { 
    fprintf(stderr, "Error: failed to open file %s for reading\n", argv[1]); 
    return 1; 
    } 
    char tmpp[1000]; 
    int count = 0; 
    char* nexts = argv[2]; 
    while (fgets(tmpp, sizeof(tmpp), fp) != 0) 
    { 
    char *tmp = tmpp; 
    while ((tmp = strstr(tmp, nexts)) != 0) 
    { 
     count++; 
     tmp++; 
    } 
    } 
    printf("%d\n", count); 
    fclose(fp); 

    return 0; 
} 

的主要區別是,這個循環讀取輸入文件多行。你只能使用一行輸入來處理文件。

相關問題