S
Die Codezeile
result = getopt(argc, argv, "i::f::o::");
wird nur einmal ausgefürt und sollte in jedem Schleifendurchgang ausgeführt werden.
printf("~ input-file <%s>\n",argv[optind++]);
strcat(input, argv[optind++]);
hier inkrementierst du optind zweimal, obwohl nur einmal notwendig ist. Irgendwann hast du strcat(input, NULL) , weil der letzte Eintrag in argv ein NULL Pointer ist und dann kracht es.
Hier ein Bsp aus der man page
The following trivial example program uses getopt() to handle two program options: -n, with no associated
value; and -t val, which expects an associated value.
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
int flags, opt;
int nsecs, tfnd;
nsecs = 0;
tfnd = 0;
flags = 0;
while ((opt = getopt(argc, argv, "nt:")) != -1) {
switch (opt) {
case 'n':
flags = 1;
break;
case 't':
nsecs = atoi(optarg);
tfnd = 1;
break;
default: /* '?' */
fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n",
argv[0]);
exit(EXIT_FAILURE);
}
}
printf("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind);
if (optind >= argc) {
fprintf(stderr, "Expected argument after options\n");
exit(EXIT_FAILURE);
}
printf("name argument = %s\n", argv[optind]);
/* Other code omitted */
exit(EXIT_SUCCESS);
}