【问题标题】:How to replace string in a file in C?如何用C替换文件中的字符串?
【发布时间】:2020-05-08 01:13:19
【问题描述】:

我需要编写一个通过命令行获取输入的程序,其中第一个参数是文件名,第二个参数是要替换的单词,第三个参数是要替换的单词。如果我输入具有相同长度的单词,则程序可以工作,但是当我更改长度时,它会保留一些字符。例如:

我在走路 /* 文件 test.txt 中的文本 */ 命令行参数:test.txt 是 am

输出:我在走路

主要功能

int main(int argument_count, char ** argument_vector)

代码:

FILE * stream;
char string[15];
if(stream = fopen(* (argument_vector + 1), "r+"))
{
    while(fscanf(stream, "%s", string) != EOF)
    {
        if(!(strcmp(string, * (argument_vector + 2))))
        {
            int x = -(strlen(string));
            fseek(stream, x, SEEK_CUR);
            fprintf(stream, "%s", * (argument_vector + 3));
            fseek(stream, 0, SEEK_CUR);
        }
    }
    fclose(stream);
}
else printf("Error while reading file");
return 0;

【问题讨论】:

  • 而不是*(x + n) 只是做x[n],它更容易阅读。按照惯例,main 被定义为int main(int argc, char** argv),所以argv[1] 是这样做的方式。
  • 最经典的做法是读取整个文件以查找您想要的数据并写出包含更改的新文件。对文本文件进行就地更改非常困难
  • @MarkoMajstorovic 为什么不能创建新文件?
  • @tadman 只是在练习指针算术,我会记住这一点。
  • 记住x[n]也是指针运算。在 C 中,这两者只是表达同一事物的不同方式,但使用最易读的形式。 for (char* x = y; *x; ++x) 有时可能是,其他时候是 x[i]

标签: c


【解决方案1】:

您不能更改搜索字符串的长度。

由于您希望能够用不同长度的字符串替换原始字符串,您将不得不完全加载文件、修改内容并将其写回或写入临时文件并在之后重命名:

FILE * stream;
FILE * output;

char string[15];
if(stream = fopen(* (argument_vector + 1), "r+"))
{
    output = fopen("out.txt", "w");
    while(fscanf(stream, "%s", string) != EOF)
    {
        if(!(strcmp(string, * (argument_vector + 2))))
        {
            int x = -(strlen(string));
            fprintf(output, "%s ", * (argument_vector + 3));
        }
        else {
            fprintf(output, "%s ", string);
        }
    }
    fclose(stream);
    fclose(output);


    remove(* (argument_vector + 1));
    rename("out.txt", * (argument_vector + 1));
}
else printf("Error while reading file");
return 0;

注意几点:

你现在必须自己写单词之间的空格。出于与不需要的字符相同的原因,它们被留在文件缓冲区中。因此 fprintf 中的空格调用。

这是一个非常基本的实现。您可以替换书面文本中的单词。如果要替换部分单词或多个单词,则必须使用strstr 来查找子字符串。

最后一个非常非常重要的提示:使用fscanf(stream, "%s", string) 是一个巨大的安全漏洞。您可以将任何内容写入缓冲区及其他。这称为缓冲区溢出。现在不相关,但有一天您可能想在重要的地方编写代码。

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2010-12-27
    相关资源
    最近更新 更多