Условная последовательность событий - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь написать функцию, которая сканирует IP-адреса при вводе пользователем и имеет три основных условия:

  1. Если IP-адрес действителен, valid_addresses += 1
  2. ЕслиIP-адрес точно равен -1.-1.-1.-1, затем прекратите сканирование для поиска любых дальнейших IP-адресов и верните valid_addresses (должно содержать количество действительных адресов).
  3. Если IP-адрес содержит любое значение, которое меньше или равно 0 или выше255, printf("Invalid input.\n"), но продолжайте поиск других IP-адресов (не прерывайте цикл).

Моя текущая попытка - просто напечатать «Неверный ввод»:

Main:

#include <stdio.h>

int LENGTH = 5; /* Tells the function how many IP addresses the user needs to provide on input */
char dot; /* Stores the points between digits */

  struct ipaddr{ /* Making the ip address struct */
    int octet1;
    int octet2;
    int octet3;
    int octet4;
  }; typedef struct ipaddr ipaddr_t;

int get_valid_ip_addrs(ipaddr_t addr_array[], int addr_array_len); /* Function prototype */

int main(){


  struct ipaddr addr_array[LENGTH]; /* Variable declaration */

  get_valid_ip_addrs(addr_array, LENGTH); /* Function call */

}

Определение функции

    int get_valid_ip_addrs(ipaddr_t addr_array[], int addr_array_len){
          int valid_inputs = 0, i, k;
          for(i = 0; i < addr_array_len; i++){
          scanf("%i%c%i%c%i%c%i", &addr_array[i].octet1, &dot, &addr_array[i].octet2, &dot, 
                                    &addr_array[i].octet3, &dot, &addr_array[i].octet4);

/* Condition 1. (if the address is valid) */

          for(k = 0; k < addr_array_len; k++){ 
            if(addr_array[k].octet1 > 0 && addr_array[k].octet1 < 256 &&
               addr_array[k].octet2 > 0 && addr_array[k].octet2 < 256 &&
               addr_array[k].octet3 > 0 && addr_array[k].octet3 < 256 &&
               addr_array[k].octet4 > 0 && addr_array[k].octet4 < 256){
              valid_inputs = valid_inputs + 1;
              }

/* Condition 2 (if the address is -1.-1.-1.-1) */

           else if(addr_array[k].octet1 == -1 && 
                    addr_array[k].octet2 == -1 &&
                    addr_array[k].octet3 == -1 &&
                    addr_array[k].octet4 == -1){
              return valid_inputs;
              }

/* Condition 3 - if the address is invalid */

           else if(addr_array[k].octet1 < 0 || addr_array[k].octet1 > 255 ||
                   addr_array[k].octet2 < 0 || addr_array[k].octet2 > 255 ||
                   addr_array[k].octet3 < 0 || addr_array[k].octet3 > 255 ||
                   addr_array[k].octet4 < 0 || addr_array[k].octet4 > 255){
             printf("Invalid input.\n");
                }
           }

          }

          return valid_inputs;

        }

Я не могу понять, почему моя программа не выполняет то, что я ожидаюЛюбая помощь для новичка очень ценится!

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

У вас есть дополнительный внутренний цикл k. в котором в первом случае у вас есть только один вход, но вы все равно перебираете все элементы, для которых поведение может быть неопределенным.

int get_valid_ip_addrs(ipaddr_t addr_array[], int addr_array_len){
          int valid_inputs = 0, i, k;
          for(i = 0; i < addr_array_len; i++){
          scanf("%d%c%d%c%d%c%d", &addr_array[i].octet1, &dot,
                  &addr_array[i].octet2, &dot,&addr_array[i].octet3, &dot, &addr_array[i].octet4);
          /* Condition 1. (if the address is valid) */
            if(addr_array[i].octet1 > 0 && addr_array[i].octet1 < 256 &&
               addr_array[i].octet2 > 0 && addr_array[i].octet2 < 256 &&
               addr_array[i].octet3 > 0 && addr_array[i].octet3 < 256 &&
               addr_array[i].octet4 > 0 && addr_array[i].octet4 < 256){
              valid_inputs = valid_inputs + 1;
              }
           /* Condition 2 (if the address is -1.-1.-1.-1) */
           else if(addr_array[i].octet1 == -1 && 
                    addr_array[i].octet2 == -1 &&
                    addr_array[i].octet3 == -1 &&
                    addr_array[i].octet4 == -1){
              return valid_inputs;
              }
           /* Condition 3 - if the address is invalid */
           else if(addr_array[i].octet1 < 0 || addr_array[i].octet1 > 255 ||
                   addr_array[i].octet2 < 0 || addr_array[i].octet2 > 255 ||
                   addr_array[i].octet3 < 0 || addr_array[i].octet3 > 255 ||
                   addr_array[i].octet4 < 0 || addr_array[i].octet4 > 255){
             printf("Invalid input.\n");
                }
          }
          return valid_inputs;
}
1 голос
/ 19 апреля 2019

Попробуйте это:

typedef enum
{
    IP_GET_OK,
    IP_GET_ERROR,
    IP_GET_END,
}IP_STATUS_t;


IP_STATUS_t getIP4(char *buff, int *ip4)
{
    IP_STATUS_t result = IP_GET_ERROR;
    if(buff && ip4 && fgets(buff, 32, stdin))
    {
        if(sscanf(buff, "%d.%d.%d.%d", &ip4[0], &ip4[1], &ip4[2], &ip4[3]) == 4)
        {
            int allminusone = 1;
            for(size_t index = 0; index < 4; index++)
            {
                allminusone = allminusone && (ip4[index] == -1);
            }
            if(allminusone)
            {
                result = IP_GET_END;
            }
            else
            {
                result = IP_GET_OK;
                for(size_t index = 0; index < 4; index++)
                {
                    if(ip4[index] < 0 || ip4[index] > 0xff )
                    {
                        result = IP_GET_ERROR;
                        break;
                    }
                }
            }
        }
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...