九度OJ 1203 IP地址

本文探讨了如何通过C语言和JAVA实现IP地址的合法性验证,详细解释了两种语言版本的实现过程,并揭示了一个常见的传参错误导致的问题解决。文章还提供了一种使用string进行IP地址验证的方法,强调了数组作为参数传递时的注意事项。

题目描述:

    输入一个ip地址串,判断是否合法。

输入:

    输入的第一行包括一个整数n(1<=n<=500),代表下面会出现的IP地址的个数。
    接下来的n行每行有一个IP地址,IP地址的形式为a.b.c.d,其中a、b、c、d都是整数。

输出:

    可能有多组测试数据,对于每组数据,如果IP地址合法则输出"Yes!”,否则输出"No!”。

样例输入:
2
255.255.255.255
512.12.2.3
样例输出:
Yes!
No!
提示:

合法的IP地址为:
a、b、c、d都是0-255的整数。


本来还一直在用string,想分隔开,转换成数字来做。直到我看到 scanf("%d.%d.%d.%d"),眼泪掉下来。

代码如下:

C语言:

#include<stdio.h>

int main(void)
{
	int num;
	int a[4];
	while(scanf("%d",&num) != EOF)
	{
		for(int i = 0; i < num; i++)
		{
		scanf("%d.%d.%d.%d",&a[0],&a[1],&a[2],&a[3]);
		if(a[1]>255 || a[1]<0 || a[0]>255 || a[0]<0 || a[2]>255 || a[2]<0 || a[3]>255 ||a[3]<0)
			printf("No!\n");
		else
		    printf("Yes!\n");
		}
	}
    return 0;
}

是不是很简单呢?我觉得测试数据如果稍微难一些,肯定过不了。所以我搜集了一下大牛的代码。

JAVA版本:

import java.util.Scanner;

/**
* 1203
* 
* @author yzf
*/
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            String[] charStr = scanner.next().split("\\.");    注意在split里是“\\.”这一点在我的一篇博文中提到过
            boolean flag = true;
            for (int j = 0; j < 4; j++) {
                int m=Integer.valueOf(charStr[j]);
                if ( m< 0|| m > 255) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                System.out.println("Yes!");
            }else {
                System.out.println("No!");
            }
        }
        scanner.close();
    }
}

有一点小发现,就是可以输入一行后直接打印,不必等待全部输入完成后在集中处理输出。这样会方便不少。

平时我都是

for( int i = 0; i < num; i++ ){
    scanf("%d",&a)
}
看来今后又可以解放双手,放更多精力在算法上面了。


Duang!自己又还是先把自己原来的坑填好,以下是利用string来实现IP地址验证的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void check(char*);
int main(void)
{
	int num, i;
	char ip[500][18];
	while (scanf("%d", &num) != EOF)
	{
		for (i = 0; i < num; i++)
		{
			scanf("%17s", ip[i]);
			//最简单的输入还是scanf(“%d.%d.%d.%d”,....),省了不少事
		}
		for (i = 0; i < num; i++)
		{
			check(ip[i],i);
		}
	}
	return 0;
}

void check(char is_ip[]) //!!!注意参数传递的问题,数组做参数传递时相当于指针
{
	int j, length;
	int sum = 0;
	int point_num = 0;
	length = strlen(is_ip);
			for (j = 0; j < length; j++)
			{
				//如果输入有不是'.'或者阿拉伯数字的符号则会报错
				if (!(is_ip[j] == '.' || (is_ip[j] <= '9'&&is_ip[j] >= '0')))
				{
					printf("No!\n");
					return;
				}
				if (is_ip[j] == '.')
				{
					point_num += 1;
				}
				//如果输入的是数字,则把字符串变为数字
				//if (is_ip[i][j] != '.' && is_ip[i][j] != '\0')
				if (is_ip[j] >= '0'&&is_ip[j] <= '9')
				{
					sum = sum * 10 + is_ip[j] - '0';
				}
				//遇到'.'则计算一次整数的大小
				else if (sum > 255 || sum < 0)
				{
					sum = 0;
					printf("No!\n");
					return;
				}
				//数字确定正确继续进行知道扫描完所有字符串
				else
				{
					sum = 0;
					continue;
				}
			}
			//判断是跳出循环,还是检查完所有字符都无误;同时检查点是否够数
			if (j >= length && point_num == 3)
				printf("Yes!\n");
			else if (point_num != 3)
				printf("No!\n");
		
}

Debug之路简直不堪回首,第二个函数代码比较长,最后输出总是有超出限制。反复跟着代码走了很多遍已知不见效,最后发现错误出在传参是了。具体错误见下面代码:

void check(char is_ip[][18])
{
   ... ...
}
//实际调用时
check(ip[i]);

相当于,传入的是一个 char*,可是调用时变成了char**。 数组作为参数传递时相当于指针,这句话应该好好理解了。

dnSpy是目前业界广泛使用的一款.NET程序的反编译工具,支持32位和64位系统环境。它允许用户查看和编辑.NET汇编和反编译代码,以及调试.NET程序。该工具通常用于程序开发者在维护和调试过程中分析程序代码,尤其在源代码丢失或者无法获取的情况下,dnSpy能提供很大的帮助。 V6.1.8版本的dnSpy是在此系列软件更新迭代中的一个具体版本号,代表着该软件所具备的功能与性能已经达到了一个相对稳定的水平,对于处理.NET程序具有较高的可用性和稳定性。两个版本,即32位的dnSpy-net-win32和64位的dnSpy-net-win64,确保了不同操作系统架构的用户都能使用dnSpy进行软件分析。 32位的系统架构相较于64位,由于其地址空间的限制,只能支持最多4GB的内存空间使用,这在处理大型项目时可能会出现不足。而64位的系统能够支持更大的内存空间,使得在处理大型项目时更为方便。随着计算机硬件的发展,64位系统已经成为了主流,因此64位的dnSpy也更加受开发者欢迎。 压缩包文件名“dnSpy-net-win64.7z”和“dnSpy-net-win32.7z”中的“.7z”表示该压缩包采用了7-Zip压缩格式,它是一种开源的文件压缩软件,以其高压缩比著称。在实际使用dnSpy时,用户需要下载对应架构的压缩包进行解压安装,以确保软件能够正确运行在用户的操作系统上。 dnSpy工具V6.1.8版本的发布,对于.NET程序员而言,无论是32位系统还是64位系统用户,都是一个提升工作效率的好工具。用户可以根据自己计算机的操作系统架构,选择合适的版本进行下载使用。而对于希望进行深度分析.NET程序的开发者来说,这个工具更是不可或缺的利器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值