1. 程式人生 > >判斷輸入的IP V4地址字串是否合法

判斷輸入的IP V4地址字串是否合法

輸入描述:

輸入的第一行包括一個整數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;
}