九度OJ 1203 IP地址

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

    输入一个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**。 数组作为参数传递时相当于指针,这句话应该好好理解了。

内容概要:本文详细探讨了双馈风力发电机(DFIG)在Simulink环境下的建模方法及其在不同风速条件下的电流与电压波形特征。首先介绍了DFIG的基本原理,即定子直接接入电网,转子通过双向变流器连接电网的特点。接着阐述了Simulink模型的具体搭建步骤,包括风力机模型、传动系统模型、DFIG本体模型和变流器模型的建立。文中强调了变流器控制算法的重要性,特别是在应对风速变化时,通过实时调整转子侧的电压和电流,确保电流和电压波形的良好特性。此外,文章还讨论了模型中的关键技术和挑战,如转子电流环控制策略、低电压穿越性能、直流母线电压脉动等问题,并提供了具体的解决方案和技术细节。最终,通过对故障工况的仿真测试,验证了所建模型的有效性和优越性。 适用人群:从事风力发电研究的技术人员、高校相关专业师生、对电力电子控制系统感兴趣的工程技术人员。 使用场景及目标:适用于希望深入了解DFIG工作原理、掌握Simulink建模技能的研究人员;旨在帮助读者理解DFIG在不同风速条件下的动态响应机制,为优化风力发电系统的控制策略提供理论依据和技术支持。 其他说明:文章不仅提供了详细的理论解释,还附有大量Matlab/Simulink代码片段,便于读者进行实践操作。同时,针对一些常见问题给出了实用的调试技巧,有助于提高仿真的准确性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值