Как исправить «Отладочное утверждение не удалось!Выражение file_name! = Nullptr 'error? - PullRequest
0 голосов
/ 29 декабря 2018
#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)

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 29 декабря 2018

Ваша программа делает все необходимые проверки везде ... кроме вашего первого fopen.Если argc равно 1, то есть, если вы просто запускаете свою программу, то значение, которое вы передаете fopen, будет NULL, а не указателем на допустимую строку.(Если argc равно 0, что возможно, оно даже не будет NULL и вместо этого приведет к неопределенному поведению.)

Чтобы это исправить, измените:

if(!(source_fp=fopen(argv[1],"wb")))
{
    printf("can't open file\n");
    return 0;
}

to:

if (argc < 2 || !(source_fp = fopen(argv[1], "wb")))
{
    printf("can't open file\n");
    return 0;
}

Точно так же, как вы знаете, ошибка, которую выдает ваш компилятор, является бессмысленной.Если у вас есть для использования Windows, используйте достойный компилятор, такой как Pelles C .Он скажет вам, что такое фактические ошибки.

Кроме того, по соглашению, если что-то пошло не так, мы возвращаем что-то отличное от 0;обычно 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...