C 搜索和替换文本

C 搜索和替换文本,c,parsing,search,replace,fopen,C,Parsing,Search,Replace,Fopen,我正在编写一个小的C程序,它搜索文件中的一个文本字符串并用另一个字符串替换它,但在执行此操作时,我不断遇到一个分段错误,出于某种原因,在fgets调用后,我的缓冲区(名为C)是空的 这是我的密码: #include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <string.h> /* *program replaces all strings that match

我正在编写一个小的C程序,它搜索文件中的一个文本字符串并用另一个字符串替换它,但在执行此操作时,我不断遇到一个分段错误,出于某种原因,在fgets调用后,我的缓冲区(名为C)是空的

这是我的密码:

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



/*
 *program replaces all strings that match a certain pattern within a file
 */

int main(int argc, char** argv)
{
    // check if there are correct amount of arguments
    if(argc != 4) 
    {
            printf("Error, incorrect amount of input arguments!\n");
            return 1;
    } // end if

    // initializers
    int i;
    char* temp;
    FILE* searchFile;
    char* c = malloc(sizeof(char));
    char* fileName = malloc(sizeof(argv[1]));
    char** searchWord = malloc(sizeof(argv[2]));
    char* replaceWord = malloc(sizeof(argv[3]));

    fileName = argv[1];
    *searchWord = argv[2];
    replaceWord = argv[3];

    // checks to see if searchWord isnt too big
    if(strlen(*searchWord) > 256)
    {
            printf("Error, incorrect amount of input arguments!\n");
            return 1;
    }

    // opens file
    searchFile = fopen(fileName,"r+");

    // searches through file
    do
    {
            fgets(c, 1, searchFile);

            i = 0;
            while(i < strlen(*searchWord))
            {
                    printf("search character number %i: %c\n", i, *searchWord[i]);     

                    /* 
                     * finds number of letters in searchWord 
                     * by incrementing i until it is equal to size of searchWord
                     */
                    if(strcmp(c,searchWord[i])) 
                    {

                            i++;
                    }

                    // replaces searchWord with replace word
                    if(i == (strlen(*searchWord)))
                    {
                            printf("inside replace loop\n");
                            memcpy(searchWord, replaceWord,(sizeof(replaceWord)/sizeof(char))+1);
                            printf("The search term (%s) has been replaced with the term: %s!\n",*searchWord,replaceWord);
                    }
            }
    }while(strlen(c) > 0);

    // closes file
    fclose(searchFile);
}
#包括
#包括
#包括
#包括
/*
*程序将替换文件中与特定模式匹配的所有字符串
*/
int main(int argc,字符**argv)
{
//检查是否有正确数量的参数
如果(argc!=4)
{
printf(“错误,输入参数数量不正确!\n”);
返回1;
}//如果结束,则结束
//初始化者
int i;
字符*温度;
文件*搜索文件;
char*c=malloc(sizeof(char));
char*fileName=malloc(sizeof(argv[1]);
char**searchWord=malloc(sizeof(argv[2]);
char*replaceWord=malloc(sizeof(argv[3]);
fileName=argv[1];
*searchWord=argv[2];
replaceWord=argv[3];
//检查searchWord是否太大
如果(strlen(*searchWord)>256)
{
printf(“错误,输入参数数量不正确!\n”);
返回1;
}
//打开文件
searchFile=fopen(文件名为“r+”);
//在文件中搜索
做
{
fgets(c,1,搜索文件);
i=0;
而(i0);
//关闭文件
fclose(searchFile);
}

您正在将1的大小传递给fgets。但是fgets函数从给定流中读取的字符数最多比size指定的字符数少一个。因此,如果传递的大小为1,它将读取0个字符。它读起来少了一个字符的原因是为空的“行尾”字符留出了空间

当在文件末尾或出现错误时发现换行符,并且保留了换行符(如果有),fgets函数将停止读取。因此,您需要将malloc c设置为字符串中预期的字符数加上一个换行符和一个空“行尾”字符

还有几件事需要注意。以下两条语句中的第一条首先分配空间来存储文件名,然后将文件名指针指向该文件名。然后,第二个文件名指针指向传入的字符串,该字符串包含程序的第一个参数:

char* fileName = malloc(sizeof(argv[1]));
fileName = argv[1];
直接将文件名指针指向此处,不分配任何内存:

char* fileName = argv[1];
或者,如果确实需要分配内存,请更改第二行以复制字符串的内容:

char* fileName = malloc(sizeof(argv[1]));
strcpy(fileName,argv[1]);
或者,更容易使用strdup分配内存,然后复制内容:

char* fileName = strdup(argv[1]);

您正在将1的大小传递给FGET。但是fgets函数从给定流中读取的字符数最多比size指定的字符数少一个。因此,如果传递的大小为1,它将读取0个字符。它读起来少了一个字符的原因是为空的“行尾”字符留出了空间

当在文件末尾或出现错误时发现换行符,并且保留了换行符(如果有),fgets函数将停止读取。因此,您需要将malloc c设置为字符串中预期的字符数加上一个换行符和一个空“行尾”字符

还有几件事需要注意。以下两条语句中的第一条首先分配空间来存储文件名,然后将文件名指针指向该文件名。然后,第二个文件名指针指向传入的字符串,该字符串包含程序的第一个参数:

char* fileName = malloc(sizeof(argv[1]));
fileName = argv[1];
直接将文件名指针指向此处,不分配任何内存:

char* fileName = argv[1];
或者,如果确实需要分配内存,请更改第二行以复制字符串的内容:

char* fileName = malloc(sizeof(argv[1]));
strcpy(fileName,argv[1]);
或者,更容易使用strdup分配内存,然后复制内容:

char* fileName = strdup(argv[1]);

为什么你只阅读一个带有FGET的角色?在这种情况下,只需使用fgetc,这样就更清楚了。与Richard的评论相关,当你只阅读一个字符时,为什么还要为它分配内存呢?只需声明
charc&c
。第二件您应该研究的是
sizeof
strlen
之间的差异。为什么使用fgets只读取一个字符?在这种情况下,只需使用fgetc,这样就更清楚了。与Richard的评论相关,当你只阅读一个字符时,为什么还要为它分配内存呢?只需声明
charc
然后在需要指向该字符的指针时使用
&c
。第二件事是
sizeof
strlen
之间的区别。