strcpy() 段错误
Strcpy() Segmentation Fault
我创建了一个函数,它搜索文件的每一行并尝试将参数 par_string
与文件中的字符串相匹配。我有适用于双精度和整数的函数变体,但我似乎无法修改函数以从文件中读取字符串。
目前我正在使用sscanf()
读取一行,我目前的努力是使用strcpy()
将文件中的字符串复制到文件中定义的字符串参数parameter
函数参数。但是,一旦达到 strcpy()
,我的函数就会出现段错误,我不太明白为什么。
我希望能够在我的主函数中以 read_string("FILENAME", filename);
的形式调用该函数,以便能够将参数传递给该函数并将文件名返回给变量 filename
.我尝试使用
定义 filename
char filename[MAXLINE]
和
char *filename = malloc(sizeof(*filename) * MAXLINE);
但两者都有同样的问题。
下面是我写的函数。有什么明显的我遗漏的东西或者有更好的方法吗?
谢谢!
int
read_string(char par_string[], char *parameter)
{
char line[MAX_LINE], ini_par_name[MAX_LINE], par_separator[MAX_LINE];
char par_value[MAX_LINE];
FILE *par_file;
if ((par_file = fopen(INI_FILE, "r")) == NULL)
{
printf("Cannot open parameter file 'plane.ini'.\n");
exit(-1);
}
int linenum = 0;
parameter = STRING_NO_PAR_CONST;
while(fgets(line, MAX_LINE, par_file) != NULL)
{
linenum++;
/*
* If the line is a comment, skip that line. Note: There is a bug here
* which will cause the script to crash if there is a blank line.
*/
if (line[0] == '#' || line[0] == ' ')
{
continue;
}
/*
* Check a normal line is in the correct format
*/
if (sscanf(line, "%s %s %s", ini_par_name, par_separator, par_value) \
!= 3)
{
printf("Syntax error, line %d for parameter %s\n", linenum,
par_string);
exit(-1);
}
/*
* Use strcmp to compare the difference between two strings. If it's
* the same parameter, then strcmp will return 0.
*/
if (strcmp(par_string, ini_par_name) == 0)
{
strcpy(parameter, par_value);
}
}
/*
* If parameter wasn't updated, the parameter was not found. Return an
* error.
*/
if (parameter == STRING_NO_PAR_CONST)
{
printf("Parameter %s could not be found.\nExiting simulation.\n",
par_string);
exit(-1);
}
if (fclose(par_file) != 0)
{
printf("File could not be closed.\n");
exit(-1);
}
return 0;
}
这条线在做什么?
parameter = STRING_NO_PAR_CONST;
如果它正在分配 parameter
指向一个字符串文字,那可能是你的问题,你不能修改字符串文字的内容。
如果 STRING_NO_PAR_CONST
是 '[=15=]'
,那只是 char
,而不是 string
。只要 parameter
在调用 read_string()
之前正确分配了一些内存,您就可以
parameter[0] = STRING_NO_PAR_CONST
当您检查它是否已更改时也是如此
if (parameter[0] == STRING_NO_PAR_CONST)
几件事
strcpy 的调用方式如下 -> strcpy(destination, source)。您正在使用参数作为目标。
也就是说,您分配的 space 数量应该是您想要的字符串的最大大小。我不认为它应该等于给定文件中的最大行数(尽管我可能错了)
我创建了一个函数,它搜索文件的每一行并尝试将参数 par_string
与文件中的字符串相匹配。我有适用于双精度和整数的函数变体,但我似乎无法修改函数以从文件中读取字符串。
目前我正在使用sscanf()
读取一行,我目前的努力是使用strcpy()
将文件中的字符串复制到文件中定义的字符串参数parameter
函数参数。但是,一旦达到 strcpy()
,我的函数就会出现段错误,我不太明白为什么。
我希望能够在我的主函数中以 read_string("FILENAME", filename);
的形式调用该函数,以便能够将参数传递给该函数并将文件名返回给变量 filename
.我尝试使用
filename
char filename[MAXLINE]
和
char *filename = malloc(sizeof(*filename) * MAXLINE);
但两者都有同样的问题。
下面是我写的函数。有什么明显的我遗漏的东西或者有更好的方法吗?
谢谢!
int
read_string(char par_string[], char *parameter)
{
char line[MAX_LINE], ini_par_name[MAX_LINE], par_separator[MAX_LINE];
char par_value[MAX_LINE];
FILE *par_file;
if ((par_file = fopen(INI_FILE, "r")) == NULL)
{
printf("Cannot open parameter file 'plane.ini'.\n");
exit(-1);
}
int linenum = 0;
parameter = STRING_NO_PAR_CONST;
while(fgets(line, MAX_LINE, par_file) != NULL)
{
linenum++;
/*
* If the line is a comment, skip that line. Note: There is a bug here
* which will cause the script to crash if there is a blank line.
*/
if (line[0] == '#' || line[0] == ' ')
{
continue;
}
/*
* Check a normal line is in the correct format
*/
if (sscanf(line, "%s %s %s", ini_par_name, par_separator, par_value) \
!= 3)
{
printf("Syntax error, line %d for parameter %s\n", linenum,
par_string);
exit(-1);
}
/*
* Use strcmp to compare the difference between two strings. If it's
* the same parameter, then strcmp will return 0.
*/
if (strcmp(par_string, ini_par_name) == 0)
{
strcpy(parameter, par_value);
}
}
/*
* If parameter wasn't updated, the parameter was not found. Return an
* error.
*/
if (parameter == STRING_NO_PAR_CONST)
{
printf("Parameter %s could not be found.\nExiting simulation.\n",
par_string);
exit(-1);
}
if (fclose(par_file) != 0)
{
printf("File could not be closed.\n");
exit(-1);
}
return 0;
}
这条线在做什么?
parameter = STRING_NO_PAR_CONST;
如果它正在分配 parameter
指向一个字符串文字,那可能是你的问题,你不能修改字符串文字的内容。
如果 STRING_NO_PAR_CONST
是 '[=15=]'
,那只是 char
,而不是 string
。只要 parameter
在调用 read_string()
之前正确分配了一些内存,您就可以
parameter[0] = STRING_NO_PAR_CONST
当您检查它是否已更改时也是如此
if (parameter[0] == STRING_NO_PAR_CONST)
几件事
strcpy 的调用方式如下 -> strcpy(destination, source)。您正在使用参数作为目标。
也就是说,您分配的 space 数量应该是您想要的字符串的最大大小。我不认为它应该等于给定文件中的最大行数(尽管我可能错了)