哪位大神帮忙看下这个程序题目,我写了好多次了,都没有正确

题目描述在基于Internet的程序中,我们常常需要判断一个IP字符串的合法性。合法的IP是这样的形式:A.B.C.D其中A、B、C、D均为位于[0,255]中的整数。为... 题目描述

在基于Internet的程序中,我们常常需要判断一个IP字符串的合法性。
合法的IP是这样的形式:
A.B.C.D
其中A、B、C、D均为位于[0, 255]中的整数。为了简单起见,我们规定这四个整数中不允许有前导零存在,如001这种情况。
现在,请你来完成这个判断程序吧^_^

输入

输入由多行组成,每行是一个字符串。
字符串长度最大为30,且不含空格和不可见字符

输出

对于每一个输入,单独输出一行
如果该字符串是合法的IP,输出Y,否则,输出N

样例输入
1.2.3.4
a.b.c.d
267.43.64.12
12.34.56.bb
210.43.64.129
-123.4.5.6

样例输出
Y
N
N
N
Y
N
展开
 我来答
帐号已注销
2017-10-25 · TA获得超过463个赞
知道小有建树答主
回答量:598
采纳率:65%
帮助的人:276万
展开全部
/**
 * 编译器:vs2010
 * 时间:2017年10月24日
 * @fencaide
 */

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

#define M 30
#define TRUE 1;
#define FALSE 0;

struct IP {
int a;
int b;
int c;
int d;
char ok;
};

int Validate(char *p){
int length = strlen(p);
if(length > 30){
return FALSE;
}
for(int i = 0; p[i] != 0; i++){
if(p[i] != '.' && (isspace(p[i]) || ispunct(p[i]))){
return FALSE;
}
}
return TRUE;
}

int ValidateIp(struct IP ip){
return ip.a >= 0 && ip.a <= 255 && ip.b >= 0 && ip.b <= 255 && ip.c >= 0 && ip.c <= 255 && ip.d >= 0 && ip.d <= 255;
}

int main(void){
char str[30] = { 0 };
struct IP list[M];
int len = 0;
//init
for(int i = 0; i < M;i ++){
list[i].a = -1;
list[i].b = -1;
list[i].c = -1;
list[i].d = -1;
list[i].ok = 'N';
}
//input
while(gets(str)){
if(Validate(str)){
sscanf(str, "%d.%d.%d.%d",&list[len].a, &list[len].b, &list[len].c, &list[len].d);
if(ValidateIp(list[len])){
list[len].ok = 'Y';
}
}
//max length
if(len >= M){
break;
}
len++;

}
//output
for(int i = 0; i < len; i++){
printf("%c\n",list[i].ok);
}

    getchar();
getchar();
return 0;
}

更多追问追答
追问

大哥,你的这个程序是一个死循环吧,而且像这一种题目,一般都是输入一个输出一个的

追答
不是,你看清楚,你输入一个回车一下,最后按一个ctrl+z回车就结束了
而且人家题目说了,输入多行,一次输出,好好理解题目
匿名用户
2017-10-25
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char s[20];
int value[50]={0};
int count=0,i;
while(1)
{
fflush(stdin);
gets(s);
if(strcmp(s,"")==0)
{
break;
}
int len=strlen(s);
int bNext=0;
for(i=0;i<len;i++)
{
if((s[i]=='-' || s[i]<'0' || s[i]>'9') && s[i]!='.')
{
count++;
bNext=1;
break;
}
}
if(bNext==1)
{
continue;
}
int a,b,c,d;
sscanf(s,"%d.%d.%d.%d",&a,&b,&c,&d);
if(a>255 || b>255 || c>255 || d>255)
{
count++;
continue;
}
else
{
value[count]=1;
count++;
continue;
}
}
for(i=0;i<count;i++)
{
if(value[i]==1)
{
printf("\nY");
}
else
{
printf("\nN");
}
}
return 0;
}
追问
你认真看题目了,你的这个只能用一次
追答
你运行过没有? 按着输入样例来试下, 结束输入时直接按回车(空行)
你理解错了, 是一次性输入多行, 结束输入后再一次性输出结果, 看下输入输出样例
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式