1

用户键入 $./replace i xy data.txt
data.txt包含“这是一个测试文件,仅测试文件”的字样。因此,所有 i 都将被 xy 替换,即 thxys xys 一个测试 fxyle,仅测试 fxyle

我想我已经很接近了。但是,我的代码没有将 i 替换为 xy,而是将 i 替换为 x。我认为错误在第 38 行 strcpy。但是,从第 30 行到第 40 行的逻辑是否正确?我想说....

对于第一个缓冲区(buf)中的每个元素, 如果 buf element == 'i'将
buf 元素复制到另一个缓冲区(temp),则一次一个字符 将 '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

你只有一个增量BufElement,但是因为你的 dest-buffer 可能比输入更大或更小,你应该有两个计数器/指针;一个用于下一个写入目标缓冲区的位置,另一个类似于输入缓冲区。

编辑:伪代码:

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 回答