Как проверить, являются ли аргументы командной строки целочисленными - PullRequest
0 голосов
/ 13 октября 2019

Я новичок в кодировании и C, и я не могу понять, как использовать аргументы командной строки, чтобы узнать, являются ли они целыми числами, и если это правда, продолжайте работать с ними.

Я пытался использоватьsscanf, но я не уверен, как я могу использовать его, чтобы проверить, являются ли аргументы целыми числами.

 #include<stdlib.h>

 #include<stdio.h>

 #define MAX_SIZE 100

int main(int argc, char* argv[]) {
   int status;
   char ch;

      status = sscanf(argv[1], "%d%c", &n, &ch);  
      if(status==1){
         printf("argument is %d", argv[1]); //to see whats arg 1

      }
      else {
    // if they're not int
          printf("Usage: Subset n k (n and k are ints)");
    }
return EXIT_SUCCESS;   
}

Я хотел посмотреть, смогу ли я распечатать аргументы, но если я введу одну или несколько целых, это даст мнечисло типа "-432743335". Если я ввожу что-то кроме целого числа, я получаю информацию об использовании, чтобы это работало. Если аргументов нет, я получаю ошибку сегментации: 11

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

Вы очень близки, просто кажется, что вы перепутали пару переменных. Первый 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

Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 13 октября 2019

Не игнорируйте предупреждения:

foo.c:14:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]
   14 |          printf("argument is %d", argv[1]); //to see whats arg 1
      |                              ~^   ~~~~~~~
      |                               |       |
      |                               int     char *
      |                              %s

Либо показать аргумент в виде строки с %s, либо показать проанализированное целое число как целое с %d (как здесь):

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
  int status;
  int n;
  char ch;

  status = sscanf(argv[1], "%d%c", &n, &ch);
  if(status==1){
    printf("argument is %d", n);
  }
  else {
    printf("Usage: Subset n k (n and k are ints)");
  }
  return EXIT_SUCCESS;
}

Чтобы избежать сбоя, если вы не введете аргумент, проверьте, равно ли argc (количество аргументов) как минимум 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...