判斷輸入的IP V4地址字串是否合法
阿新 • • 發佈:2018-12-01
輸入描述:
輸入的第一行包括一個整數n(1<=n<=500),代表下面會出現的IP地址的個數。
接下來的n行每行有一個IP地址,IP地址的形式為a.b.c.d,其中a、b、c、d都是整數。
輸出描述:
可能有多組測試資料,對於每組資料,如果IP地址合法則輸出"Yes!”,否則輸出"No!”。
合法的IP地址為:
a、b、c、d都是0-255的整數。
輸入例子:
2
255.255.255.255
512.12.2.3
輸出例子:
Yes!
No!
/*這種寫法感覺有很多錯誤喃……如果輸入負數?*/ #include <stdio.h> #include <string.h> bool checkIP(char *s) { int numOfChar = strlen(s); if(numOfChar>15) // IP v4 0.0.0.0 ~ 255.255.255.255 return false; int i,dotAdd[3],dotCount = 0; for (i = 0; i < numOfChar; i++) // 找出.所在的下標 可以考慮邊判斷邊動指標i { if (s[i] == '.') { dotCount++; if (dotCount > 3) return false; dotAdd[dotCount-1] = i; // 日常下標減一 常見錯誤 } } if (dotCount != 3) return false; int num, j; for (i = 0; i < dotCount; i++) // 只判斷了.前面的符不符合要求,最後一個數字也要判斷 { num = 0,j = 1; // 通過.的位置定位其前後的數字字元並轉化為數字 int index = dotAdd[i]-1; // 定位字串中的.對其前面的數進行轉換和求和操作 index > 0 && s[index] != '.' while (index >= 0 && s[index] != '.') { num = num + j*(s[index] - '0'); j *= 10; index--; } if (num > 255) return false; } int lastDot = dotAdd[2]; num = 0, j = 1; while (s[numOfChar - 1] != '.') { numOfChar--; num = num + j*(s[numOfChar] - '0'); j *= 10; } if (num > 255) return false; return true; } int main() { char input[20]; int n; scanf("%d", &n); while (n--) { scanf("%s", input); bool a = checkIP(input); (a == false) ? printf("No!\n") : printf("Yes!\n"); } return 0; }
/*另外一種做法*/ #include <stdio.h> #include <string.h> bool checkIP(char *s) { int index = strlen(s) - 1; if (strlen(s) > 15) // 0.0.0.0 ~ 255.255.255.255 return false; int i,dotCount = 0; for (i = 0; i <= index; i++) // 判斷是否存在非法輸入 { if (s[i] == '.') { dotCount++; continue; } else if (s[i] >= '0' && s[i] <= '9') continue; else return false; } if (dotCount != 3) // 合格的ip v4 地址有三個點 return false; // 使指標首先指向字串的最後一個字元,從後往前掃是為了方便計算 while (1) { int num = 0, j = 1; while (s[index] != '.' && index >= 0) { num = num + (s[index] - '0') * j; j *= 10; index--; } index--; if (num > 255) return false; if (index < 0) break; } return true; } int main() { char input[20]; int n; scanf("%d", &n); while (n--) { scanf("%s", input); bool a = checkIP(input); (a == false) ? printf("No!\n") : printf("Yes!\n"); } return 0; }