Аргументы командной строки и пустая строка в условии

Изучая c++, наткнулся на вот такой пример:

// В некоторых операционных системах argv[0] может быть просто пустой строкой, без имени программы
// Обрабатываем случай, когда argv[0] может быть пустым или не пустым
if (argv[0])
    std::cout << "Usage: " << argv[0] << " <number>" << '\n';
else
    std::cout << "Usage: <program name> <number>" << '\n';

Данный пример ввел меня в ступор. Насколько я знаю, указатель на пустую строку будет всегда true следовательно else никогда не выполнится. Либо я что-то не понимаю, либо в этом примере ошибка и имелось ввиду не пустая строка а то, что argv[0] будет указывать на nullptr(а это, насколько я понимаю, разные понятия)


Ответы (1 шт):

Автор решения: AlexGlebe

стандарт :

argv[argc] shall be a null pointer.

If the value of argc is greater than zero, the string pointed to by argv[0] represents the program name; argv[0][0] shall be the null character if the program name is not available from the host environment. If the value of argc is greater than one, the strings pointed to by argv[1] through argv[argc-1] represent the program parameters.

перевод :

argv[argc] должен быть нулевым указателем.

Если значение argc больше нуля, строка, на которую указывает argv[0], представляет собой имя программы; argv[0][0] должен быть нулевым символом, если имя программы недоступно из среды хоста. Если значение argc больше единицы, то строки, на которые указывает от argv[1] до argv[argc-1], представляют параметры программы.

Ваш пример неправильный. Там проверяется, что argc == 0 и argv[argc] == NULL, то есть вообще нет никаких данных, ни имени программы, ни аргументов. По стандарту сначала нужно смотреть количество строк, и потом смотреть не пустая ли строка (то есть первая буква '\00' , а не NULL указатель как в примере).

if ( argc and argv[0][0] )
// или, что одно и то-же так :
// if ( argv[0] and argv[0][0] )
    std::cout << "Usage: " << argv[0] << " <number>" << '\n';
else
    std::cout << "Usage: <program name> <number>" << '\n';
→ Ссылка