C 搜索和替换文本
我正在编写一个小的C程序,它搜索文件中的一个文本字符串并用另一个字符串替换它,但在执行此操作时,我不断遇到一个分段错误,出于某种原因,在fgets调用后,我的缓冲区(名为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
#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
之间的区别。