#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
FILE *source_fp, *content_fp;
int ch;
if(!(source_fp=fopen(argv[1],"wb")))
{
printf("can't open file\n");
return 0;
}
for(int i = 2 ; i < argc ; i++)
{
if(!(content_fp=fopen(argv[i],"r")))
printf("can't find file%s\n", argv[i]);
else
{
while(ch = fgetc(source_fp))
{
fputc(ch,source_fp);
}
fclose(content_fp);
}
}
fclose(source_fp);
}
运行该程序时,我收到以下错误消息:
Debug Assertion Failed!
Program: ...ments\Visual Studio 2015\Projects\Project9\Debug\Project9.exe File: minkernel\crts\ucrt\src\appcrt\stdio\fopen.cpp Line: 30
Expression: file_name != nullptr
For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
如何解决此问题?
答案 0 :(得分:1)
您的程序会在所有地方进行所有必要的检查 ...,除了您的第一个fopen
。如果argc
是1
(如果您只是运行程序),则传递给fopen
的值将是NULL
,而不是指向有效字符串的指针。 (如果argc
是0
(可能的话,甚至不会是NULL
,而是会导致未定义的行为。)
要解决此问题,请更改:
if(!(source_fp=fopen(argv[1],"wb")))
{
printf("can't open file\n");
return 0;
}
收件人:
if (argc < 2 || !(source_fp = fopen(argv[1], "wb")))
{
printf("can't open file\n");
return 0;
}
您知道,编译器给您的错误有点荒谬。如果您要使用Windows,请使用Pelles C之类的不错的编译器。它会告诉您什么是 actual 错误。
此外,按照惯例,如果出现问题,我们将返回0
以外的其他值;通常为1
。