Вы очень близки, просто кажется, что вы перепутали пару переменных. Первый n
нигде не объявлен, что приводит к неопределенному поведению при попытке преобразования с sscanf
в &n
. (ваш компилятор должен выкрикивать предупреждения и ошибки - вышеприведенный код не должен компилироваться)
Нет необходимости в ch
. Вместо этого переберите все аргументы из 1 -> argc
(argv[0]
- это всегда имя запускаемой программы). Вы выполняете Great Job , проверяющий возвращение из sscanf
- это правильное кодирование. Вы можете просто использовать флаг состояния (подойдет любая переменная int
), и если встречается нецелое число, просто установите свой флаг TRUE
(например, любое значение, отличное от нуля), и это позволит вам перебрать всеаргументы, а затем определяют в конце, встречается ли нецелое число, например,
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
int main (int argc, char *argv[]) {
int nonint = 0; /* simple status flag, set if non-integer encountered */
for (int i = 1; i < argc; i++) { /* loop over all arguments */
int status, n;
status = sscanf (argv[i], "%d", &n); /* attempt conversion */
if (status == 1) /* validate return */
printf ("argument[%d] is %d\n", i, n); /* output int argument */
else { /* otherwise handle error & set nonint flag = TRUE */
printf ("argument[%d] non-integer argument: %s.\n", i, argv[i]);
nonint = 1;
}
}
if (nonint) { /* if nonint flag set, show usage */
fputs ("\nUsage: Subset n k (n and k are ints)\n", stderr);
exit (EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
Пример использования / Вывод
Если есть нецелые аргументы,Флаг nonint
установлен выше, использование отображается после определения нецелых аргументов, и возвращается EXIT_FAILURE
:
$ ./bin/cliargs 1 2 3 four 5 six 7
argument[1] is 1
argument[2] is 2
argument[3] is 3
argument[4] non-integer argument: four.
argument[5] is 5
argument[6] non-integer argument: six.
argument[7] is 7
Usage: Subset n k (n and k are ints)
Подтверждение возврата:
$ echo $?
1
Если все аргументыцелые числа, тогда использование не показывается, и возвращается EXIT_SUCCESS
:
$ ./bin/cliargs 1 2 3 4 5 6 7
argument[1] is 1
argument[2] is 2
argument[3] is 3
argument[4] is 4
argument[5] is 5
argument[6] is 6
argument[7] is 7
Подтверждение возврата:
$ echo $?
0
Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.