代码之家  ›  专栏  ›  技术社区  ›  Davide Lorino

条件事件序列

  •  0
  • Davide Lorino  · 技术社区  · 7 年前

    1. 如果IP地址有效, valid_addresses += 1
    2. 如果IP地址 -1.-1.-1.-1 然后停止扫描任何其他IP地址并返回 valid_addresses
    3. 如果IP地址包含任何低于0或高于255的值, printf("Invalid input.\n") 但是继续扫描更多的IP地址(不要终止循环)。

    主要内容:

    #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 回复  |  直到 7 年前
        1
  •  1
  •   0___________    7 年前

    试试这个:

    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;
    }
    
        2
  •  1
  •   Pratik Sampat    7 年前

    你有一个额外的内心世界 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;
    }