【发布时间】:2014-05-29 08:14:52
【问题描述】:
我正在尝试使用 C 语言处理文件。我想要一个函数来接收指向 FILE 的指针,询问要读取的文件的名称,并将其初始化以供读取。所以,我是这样写的:
void initFileReading(FILE* fp){
char dic[40];
printf("Dictionary file: ");
scanf("%40[^\n]", dic);
fp = fopen(dic, "r");
}
int main(){
int diff, i, nWords, Len;
char str[16];
FILE* fp;
initFileReading(fp);
fscanf(fp, "%s", str);
printf("%s", str);
return 0;
}
当我尝试运行它时,我得到一个 SegFault。但是,如果我将函数中的内容放在 main 中,它运行良好。谁能给我一点见解?
谢谢。
【问题讨论】:
-
请注意,虽然使用
"%40[^\n]"是(大多数情况下)一个好主意,但您必须在格式字符串中指定不带终止空值的长度,因此请使用"%39[^\n]"或char str[41];以避免1 字节覆盖。 (是的,它不符合现代习语,但改变它会破坏很多代码,所以它没有改变。) -
@JonathanLeffler 您似乎是一位经验丰富的 C 程序员,为什么不直接提出正确的解决方案 (
fgets()) 来代替? -
@user3477950:两个原因(值得商榷)。 (1)问题使用
scanf(),这不是自动错误的,指出正确使用scanf()的微妙之处是帮助SO的重要部分,(2)使用fgets()并不是一个简单的替代品,因为你必须准备好处理输入字符串中的换行符,并准备好处理它的缺失(表明输入字符串 -- 文件名 -- 比允许的空间长)。 [...然后是“我为什么没想到?”...]