daemonio
(usa Slackware)
Enviado em 16/11/2006 - 10:22h
Aí, já faz bem tempo que você postou esta dúvida, talvez você já a tenha a esclarecido;
Bom,eu recomendaria para você o uso da função getopt_long ao invés de getopt. A getopt_long oferece tudo que a getopt oferece e ainda mais, você pode criar opções do estilo "--help" "--delete",
pequenas "-h" -d" e flags (semáfaros como você disse) "--interactive" "--force" .. etc.
Bom, no 1º paragráfo, você colocou:
if ( optarg == NULL ) ...
Não precisa, getopt já testa isto para você. Quando você usa a letra da opção seguida de ':', getopt obriga o usuário a usar um argumento para esta opção, mostrando uma mensagem de erro e retornando '?' em optopt.
Em:
While (optarg[i]!=null){
if ((optarg[i]-'0'>=0) &&(optarg[i]-'0'<=9)) /*...*/
Você pode testar se optarg é um número, através de um if em cada case no switch.
case 'i': /* opcao flag i */
if ( optarg[0] == '0' ) // o número é zero?
noi = 0 ;
else if ( atoi(optarg) != 0 ) /* !=0 em caso de acerto */
noi = atoi(optarg) ;
/* pequeno exemplo, testa aí para ver
se dá certo. */
break ;
Agora no segundo caso, onde você queria que o programa saísse caso usasse uma opção flag (ou semáforo) com argumento, você poderia tirar
o ':' do parâmetro de getopt(). ficaria:
getopt(argc, argv, "t:i:n:qf") ...
O ':' representa "opção que recebe argumento", como elas duas (-q e -f) não recebem, então não precisa do ':'.
Testa aí e manda um reply se puder. Tenho tutoriais aqui sobre getopt e getopt_long se quiser mando para você.
[]'z
Daemonio