1

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

这是我的代码:

#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);
}
4

1 回答 1

1

您将 1 的大小传递给 fgets。但是 fgets 函数最多从给定流中读取的字符数比由大小指定的字符数少一个。因此,如果您传递 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]);
于 2012-10-23T04:17:08.450 回答