程序似乎在退出(0)后继续运行

时间:2016-10-07 01:54:53

标签: c++

在运行时,程序从命令行获取一个或多个参数,每个参数都是要打开的文件的名称。

argc ==文件名的数量。

argv [0] ==该计划的名称。

argv [n],其中n是一个整数==给定的文件名,根据它们从命令行传递的顺序。

next_file前进到要编辑的下一个文件。它增加n,如果n大于argc则退出;因为这意味着已经达到了最后一个文件。否则,它调用file_handler。

file_handler接受一个流对象[file],一个字符串[name]和一个布尔变量[open]。如果open为0,则关闭当前文件。如果open为1,则用[file]打开[name]。

当调用next_file时,预期的行为是它将关闭当前打开的文件,将[n]提前一,然后打开下一个文件。它应该在尝试打开一个不存在的文件之前退出。

该函数正常工作,直到到达最后一个文件,此时抛出调试断言。

void next_file ( int & n , int argc , char *argv [] , fstream & file )
{
    n++;
    if ( n > argc )
        exit ( 0 );
    file_handler ( file , argv [n - 1] , 0);
    file_handler ( file , argv [n] , 1 ); //this appears to be the cause of the assertion failure
}

void file_handler ( fstream & file , string name , bool open )
{
    if ( open == 0 )
    {
        file.close ();
        file.clear ();
        return;
    }
    in.open ( name , ios::in | ios::out | ios::binary );
    if ( !in.is_open () )
    {
        cout << "\n Failed opening " << name << "\n\n";
        exit (0);
    }
}

2 个答案:

答案 0 :(得分:1)

你跑掉阵列的末尾。

如您所知,当数组包含n个元素时,它们的值为array[0]array[n-1]

n++;
if ( n > argc )
    exit ( 0 );

此时,n的最高可能值为argc,因为如果n > argcexit(0)被调用。但是当n等于argc时,这将继续。因此:

file_handler ( file , argv [n] , 1 ); //this appears to be the cause of the assertion failure

当然这将是断言的原因。如上所述,此处n的最高值为argc

当然,argv[argc]不存在。 argc中有argv个值,因此最后一个值为argv[argc-1]

实际上,设置argv main()参数的方式,argv[argc]将返回nullptrfile_handler()的此参数为std::string,尝试从std::string构建nullptr将提升您的断言。

答案 1 :(得分:0)

对于main参数,argv[argc]的值保证为0.

然后,使用n == argc

file_handler ( file , argv [n] , 1 )

......相当于

file_handler ( file , 0 , 1 )

...其中0用于初始化std::string正式参数,这是非常不合适的。