2012-04-20 66 views
0

我正在嘗試編寫一個名爲replace的linux命令,它將替換文件中的字符。我希望把它像這樣:通過命令行替換字符

$./replace I XY test.txt 

在這個例子中,test.txt包含單詞「這是一個測試文件」

我怎麼能替換字符'I'"XY"。我試圖使用一個緩衝區,例如下面給出的代碼,但由於緩衝區和argv聲明不同,它會產生一個錯誤。此外,'I'存儲在一個數組元素中,而"XY"需要兩個。有沒有解決這個問題的方法?

考慮text.txt例如:

在這個例子中,第三個指標(其中包含'I')必須"XY"

更換這裏是我的代碼,它具有上述問題:

#define BUFFERSIZE 4096 

/*replace i xy data.txt */ 
int main(int ac, char *av[]) 
{ 
    int in_fd, out_fd, n_chars, BufElement,j; 
    char buf[BUFFERSIZE]; 
    in_fd=open(av[3], O_RDWR); 

    /*Read characters from file to buffer*/ 
    while ((nread = read(in_fd , buf, BUFFERSIZE)) > 0) 
    { 
     for (BufElement=0;BufElement < nread;BufElement++) 
     { 
      for (j=0; j < strlen(av[1]); j++) 
      { 
       if (buf[BufElement] == av[1][j]) 
        buf[BufElement] = av[2]; /*ERROR*/ 
      }/*for*/ 
     }/*for*/ 
    }/*while*/ 
}/*main*/ 
+0

爲什麼不直接在這裏發佈代碼? – slartibartfast 2012-04-20 06:23:00

+0

可能重複的[如何替換c中的子字符串](http://stackoverflow.com/questions/3659694/how-to-replace-substring-in-c) – 2012-04-20 06:27:28

回答

1

buf[BufElement]是一個字符,av[2]是一個字符串(字符p特別是)。你不能像你所做的那樣將兩者等同起來(buf[BufElement] = av[2];)另外,即使有可能,你也無法簡單地用C中的緩衝區中的2個字節替換1個字節。它將覆蓋下一個字符。

您需要複製文件內容,直到在臨時緩衝區中找到匹配項,然後將替換字符串附加到此臨時緩衝區,然後複製文件的其餘內容。

+0

所以只是爲了驗證。我將「這是一個測試文件」逐個字符地複製到緩衝區。當我複製時,我檢查argv [2] == i。如果匹配,則將X Y放入緩衝區,並將文件的其餘部分複製到緩衝區中。但後來我必須具體說如果argv [2] =='我'然後把XY。用戶應該能夠用他選擇的字符替換任何字符 – 2012-04-20 06:41:45

+0

是的,正確的,在這些lines.if(buffer [i] == argv [1] [0]),然後緩衝[i] ='X' ,緩衝區[i + 1] ='Y',然後繼續緩衝區[i] = fgetc(fp) – 2012-04-20 06:43:34

+0

感謝您的回覆先生。有沒有這樣做的一般方法?緩衝液[I] = 'X'。例如,如果用戶輸入$。/替換I ZS test.txt,那麼我應該用Z和S替換。因此,爲什麼我把緩衝區[i] = argv [2](但當然這是錯誤) – 2012-04-20 06:48:26