我试图写一个函数,它接收一个指向一个文件的指针和两个字符串(一个文件名和一个模式)。它应该请求一个文件名,并在错误检查时打开一个文件。但是代码不能编译,我花了几个小时寻找原因。
#include
#include
#include
#define LEN 41
char* s_gets(char *str, int len);
void openFilename(FILE* fp, char* fname, char* mode);
int main(void)
{
char fname[LEN];
FILE *fp = NULL;
int ch;
// This works
printf("Enter a filename: ");
s_gets(fname, LEN);
fp = fopen(fname, "r");
// This does not
// openFilename(fp, fname, "r");
while ((ch = getc(fp)) != EOF)
putchar(ch);
fclose(fp);
return 0;
}
char* s_gets(char *str, int len)
{
char* ret_val;
char* newline;
ret_val = fgets(str, len, stdin);
if (ret_val) {
newline = strchr(str, '\n');
if (newline)
*newline = '\0';
else
while (getchar() != '\n') continue;
}
return ret_val;
}
void openFilename(FILE *fp, char *fn, char *mode)
{
printf("Enter a filename: ");
s_gets(fn, LEN);
printf("Opening %s... ", fn); // This never runs!
if ((fp = fopen(fn, mode)) == NULL) {
fprintf(stderr, "Couldn't open %s. Quitting.\n", fn);
exit(EXIT_FAILURE);
}
}
这个
s_gets()
如果我从main调用函数,它的工作正常,但是只要我从
openFilename()
我得到了
Segmentation fault: 11
这通常和数组越界有关,对吧?我假设这个字符串不能正确传递
openFilename()
,但我怎么能做到呢?