Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对于较大的输入大小,为什么在流编辑器程序中会出现分段错误?_C_Segmentation Fault - Fatal编程技术网

C 对于较大的输入大小,为什么在流编辑器程序中会出现分段错误?

C 对于较大的输入大小,为什么在流编辑器程序中会出现分段错误?,c,segmentation-fault,C,Segmentation Fault,我调试了下面的代码,发现我的editFileToStdIn抛出了分段错误。解决这个问题的最好办法是什么?通过使用gcc编译并像so/svi command.txt

我调试了下面的代码,发现我的
editFileToStdIn
抛出了分段错误。解决这个问题的最好办法是什么?通过使用gcc编译并像so
/svi command.txt
那样运行,您可以在终端中测试代码。我的代码适用于较小的输入,但对于较大的输入,会出现分段错误,如:

#包括
#包括
#包括
#包括
#定义数组大小为100
typedef字符字符串[256];
//SVI数据结构
//-----------------------------------------------------------------//
typedef枚举{none,text,range}lineRangeSpec//范围规格
//范围规范的联合结构
typedef并集{
int无;
字符串文本;
整数范围[2];
}LineRange联盟;
//编辑运算符
类型定义结构{
lineRangeSpec specType;
lineRangeUnion说明符;
char editOperation;//将是{A,I,O,d,s}中的一个
/*A-在行的末尾追加
I-在行的开头插入。
O-在当前行之前的新行上插入
d-从文件中删除该行。
s-将行中第一次出现的替换为
*/
字符串数据;//使用编辑运算符后存储所有文本
}编辑操作员;
//-----------------------------------------------------------------//
//从文件读取和存储编辑命令
//从标准输入读取一行
bool ISEDITABLE(编辑运算符编辑、字符串currentLine、整数行号);
作废编辑文件(编辑运算符编辑,字符串行);
int readEditFile(文件*命令,EditOperator输入[]);
//根据指定的操作合成文本
EditOperator editEverywhere(字符串命令);
EditOperator editLineRange(字符串命令);
EditOperator editText(字符串命令);
EditOperator transformStruct(字符串输入);
void swapdelimiter(字符串数据、字符串前者、字符串后者);
void swapText(编辑运算符编辑,字符串行);
//输出编辑的行(除非已删除)
void editFileToStdIn(EditOperator编辑[],整数长度);
//驱动程序代码
int main(int argc,char*argv[]){
文件*命令;
整数长度;
EditOperator值[数组大小];
如果(argc<2){
printf(“错误!包括文件名。例如,`./svi a.txt>b.txt`\n”);
返回-1;
}else if((commands=fopen(argv[1],“r”))==NULL){
printf(“无法打开文件。程序已结束。\n”);
返回-1;
}否则{
长度=readEditFile(命令、值);
editFileToStdIn(值、长度);
返回0;
}
}
无效editFile(EditOperator val,字符串行){
字符串文本;
整数长度;
开关(val.editOperation){
案例“A”:
strcpy(文本、行);
长度=strlen(文本)-1;
如果(文本[长度]='\n'){
文本[长度]='\0';
}
strcat(文本、价值数据);
strcpy(行、文本);
打破
案例“d”:
第[0]行=“\0”;
打破
案例“I”:
strcpy(文本,值数据);
长度=strlen(文本)-1;
如果(文本[长度]='\n'){
文本[长度]='\0';
}
strcat(文本、行);
strcpy(行、文本);
打破
案例“O”:
printf(“%s”,值数据);
打破
案例s:
swapText(val,line);
打破
违约:
printf(“不规则编辑的输入。程序终止\n”);
出口(-1);
打破
}
}
void editFileToStdIn(EditOperator编辑[],整数长度){
字符串输入;
int currentLine=0,i;
而(fgets(输入,256,标准输入)){
电流线+=1;
对于(i=0;ireturn edit.specifier.range[0]我强烈建议您在编译时开始使用一些标志。
如果将警告作为错误启用,gcc将不允许您编译而不解决它们

$ gcc -Wall -Werror -Wextra -pedantic -std=c99 -c file_name.c
$ gcc -Wall -Werror -Wextra -pedantic -std=c99 -o program file_name.o
$ ./program
这将向您显示错误,并在解决错误之前避免编译

您还应该尝试调试器:

当您有分段错误时,可能需要在将来使用和调查。 只需在编译命令中添加标志-g

$ gcc -Wall -Werror -Wextra -pedantic -std=c99 -g -c file_name.c
$ gcc -Wall -Werror -Wextra -pedantic -std=c99 -g -o program file_name.o
$ gdb ./program
一旦输入“run”,您就可以准确地看到分段错误所在

如果您尝试此操作并获得有关错误的一些信息,请让我知道它说明了什么,以便我可以尝试为您提供更多帮助


希望有帮助!

您是否尝试过在调试器中捕获崩溃?代码中何时何地出现崩溃?当时和地点所有相关变量的值是多少?可能-因为type
String
是256个字符,您可以将其用作连接的目标。最好在另一件事是,在取消引用之前,你从来不会检查strtok的结果。@Someprogrammerdude我注意到编程在我引用的输入文件的一半时崩溃了。你可以在我的repl.it()上测试它
$ gcc -Wall -Werror -Wextra -pedantic -std=c99 -g -c file_name.c
$ gcc -Wall -Werror -Wextra -pedantic -std=c99 -g -o program file_name.o
$ gdb ./program