2016-08-06 10 views
0

Рассмотрят следующий код:с OPTARG atoi, без арг

int number; 

while((w = getopt(argc, argv, "n:s:")) != -1) { 

     switch (w){ 

      case 'n': { 

       opfile->filename = optarg; 

      }break; 

      case 's': { 

       number = atoi(optarg); 

      }break; 

     } 
} 

Теперь, когда я оставляю оба варианта или опцию s пустой, например, я начинаю свою программу, без командной строки аргументов, то переменной number все еще получает случайное значение.

Что мне здесь не хватает? Некоторая if-statement в случае s? В частности, я хочу осветить случай, когда пользователь не назначает конкретное значение/параметр s в аргументах командной строки.

ответ

5

В случае отсутствия опции 's', переданной программе, ветвь case 's' вообще не выполняется, и ничто иное не устанавливает number в значение, а это означает, что последующее чтение вызывает неопределенное поведение. (Это потенциально гораздо хуже, чем просто дает вам случайное значение, когда вы читаете из него позже. Это нужно обязательно исправить ошибку.)

Но поскольку ничего другого не касается number, это будет достаточно, чтобы изменить

int number; 

в

int number = 0; 

или то, что вы хотите, чтобы по умолчанию быть.

(Кстати, вы действительно должны использовать strtol вместо atoi, потому что atoi игнорирует синтаксические ошибки.)

+0

+1 И просто примечание к О.П., тот факт, что это только дает случайную переменную делает трудно понять, что программа может потерпеть крах на других системах (или даже в конечном итоге на одной и той же системе). UB может быть болью. – RastaJedi