我正在尝试编写一个功能,该功能可以扫描用户输入的IP地址,并且具有三个主要条件:
valid_addresses += 1
-1.-1.-1.-1
,则停止扫描其他IP地址并返回valid_addresses
(应包含有效地址的数量)。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;
}
我似乎无法弄清楚为什么我的程序没有按照我的期望去做,对于初学者的任何帮助都将不胜感激!
答案 0 :(得分:1)
尝试一下:
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;
}
答案 1 :(得分:1)
您有一个额外的内部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;
}