我正在编写一个小型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);
}
答案 0 :(得分:1)
您将1的大小传递给fgets。但是fgets函数最多只能读取给定流中大小指定的字符数。因此,如果您传递大小为1,则会读取0个字符。它少读一个的原因是为了留下'行尾'字符的空间。
当找到换行符,文件末尾或错误时,fgets函数将停止读取,并保留换行符(如果有)。因此,你需要将malloc c设置为你希望在字符串中加上一个字符加一个换行符和一个用于null'行尾'字符的字符。
还有其他一些需要注意的事项。以下两个语句中的第一个首先分配空间来存储文件名,然后将文件名指针指向它。第二个然后指向文件名指针指向传入的字符串,其中包含程序的第一个争论:
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]);