1

ユーザー タイプ $./replace i xy data.txt
data.txtには、「これはテスト ファイルです。テスト ファイルのみ」という単語が含まれています。したがって、すべての i は xy に置き換えられます。つまり、thxys xys はテスト fxyle、テスト fxyle のみです。

私はかなり近いと思います。ただし、i を xy に置き換える代わりに、私のコードは i を x に置き換えるだけです。エラーは 38 行目の strcpy にあると思います。しかし、30行目から40行目までのロジックは正しいのでしょうか? 言おうとしている……。

最初のバッファー (buf) の各要素について、
buf 要素を別のバッファー (temp) に一度に 1 文字ずつコピーします
if buf element == 'i'
'xy' を 'i' にコピーします

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


#define BUFFERSIZE 4096

/*replace i xy data.txt */

int main(int ac, char *av[])
{

    int in_fd, out_fd, n_chars, BufElement,j,x;
    ssize_t nread,nwrite;
    off_t newpos;
    char buf[BUFFERSIZE],temp[300];


        /*Open file containing original data*/
        if ( (in_fd=open(av[3], O_RDWR)) == -1 )
        {
            printf("Cannot open %s\n", av[3]);
            exit(1);
        }


        /*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++)
                {
                    temp[BufElement] = buf[BufElement];
                    if (buf[BufElement] == av[1][j])
                        strncpy(temp+BufElement,av[2],strlen(av[2])); /*ERROR*/

                }

            }
        }

        printf("%s\n",buf);
        printf("%s\n",temp);

            newpos = lseek(in_fd, 0, SEEK_SET); 

            nwrite = write(in_fd,temp,36); 

            close(in_fd);
        }

}
4

2 に答える 2

3

のインクリメントは 1 つしかありませんがBufElement、dest-buffer が入力よりも大きくなったり小さくなったりする可能性があるため、2 つのカウンター/ポインターが必要です。1 つは dest-buffer に次に書き込む場所、もう 1 つは入力バッファーに似た場所です。

編集: 擬似コード:

while src[i]
  if match
    dest[j] = replacement
    j += strlen(replacement)
    i += 1
  else
    dest[j] = src[i];
    i += 1
    j += 1
于 2012-04-20T12:10:45.680 に答える
1

あなたiはに置き換えられましたxyが、最初の(buf)yの文字に置き換えられます。buftemp[BufElement] = buf[BufElement]

Peter Miehleが言ったように、交換を行うたびにシフトをマークするためのカウンターが必要です。

strncpy(temp+BufElement,av[2],strlen(av[2]))
于 2012-04-20T13:10:03.500 に答える