思路很清晰,见下面代码注释!
遇到的是atoi函数的返回值问题,atoi()函数用来将字符串转换成整数(int),其原型为:
int atoi (const char * str);
函数说明:atoi()函数会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。
返回值:返回转换后的整型数;如果 str 不能转换成 int 或者 str 为空字符串,那么将返回 0。
所以在atoi函数返回0时,要做进一步的检查确保输入的字符串中不是非数字字符!
参考代码如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char res[30]; //存放检查结果的字符数组 int resindex = 0; //存放结果的字符数组下标 char ip[30]; //存放当前输入的ip字符串 while (fgets(ip, 30, stdin) != NULL) //如果在任何字符读取前就到达了文件尾EOF, //缓冲区就未进行修改,fgets函数返回一个NULL指针 { char *token[4]; //存放ip字符串所分割的四个子字符串 char *tmp; //每次分割得到的临时子字符串 int i = 0; if ((tmp = strtok(ip, ".")) != NULL) { token[i++] = tmp; while ((tmp = strtok(NULL, ".")) != NULL) { token[i++] = tmp; } } if (i != 4) //若分割的子字符串数量不为4,显然不是合法IP,记录结果,跳出本次循环 { res[resindex++] = 'N'; continue; } else { int num; //将每个子字符串的内容转为整数num int flag = 1; //设置一个检查结果的标志位,初始为1 int j; for (j = 0; j < 4; j++) { num = atoi(token[j]); //atoi函数将字符串转化为整数 if (num < 0 || num > 255) //只要有一个转化结果不在0~255区间就一定不合法 { res[resindex++] = 'N'; flag = -1; //标记设置为-1,表示已经非法 break; //跳出当前for循环 } //以下检查是需要注意的部分 if (num == 0) //当atoi返回0时,可能此时token[j]中有非数字字符,需要进一步检查 { char *checkchar = token[j]; //将当前token[j]赋给一个临时字符指针变量,用于检查 if (*checkchar != '\0') //碰到结束符结束检查 { if (isdigit(*checkchar)) //若该字符为数字字符,则没问题,继续检查下一个字符 { checkchar++; } else //若不为数字字符,该IP不合法,记录结果,跳出当前for循环 { res[resindex++] = 'N'; flag = -1; //标记设置为-1,表示已经非法 break; //跳出当前for循环 } } } } if (flag == 1) //从for循环出来之后若标志位未改变,则该IP合法,记录结果,跳出本次循环 { res[resindex++] = 'Y'; continue; } } } //打印检查结果 int k; for (k = 0; k < resindex; k++) { printf("%c\n", res[k]); } return 0; }
0.0分
13 人评分
第四十一行应该少个等于号吧,stdlib库atoi VC++识别不出来我不知道为什么,我用VS编译的
D164805414 2020-03-09 10:03:50 |
看错了,没看到是或
0.1.2.3 居然被判断是一个正确的IP地址。。。
AngelCaval 2020-02-07 15:29:36 |
本来就是啊
阿轩请求出战 2021-01-26 23:26:17 |
不正确么
三进制小数 (C++代码)(第11位大于1.5才能进位)浏览:1203 |
2005年春浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:627 |
简单的a+b (C语言代码)浏览:765 |
数列 (C++代码)浏览:707 |
输出正反三角形 (C语言代码)浏览:859 |
WU-拆分位数 (C++代码)浏览:819 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:826 |
小九九 (C语言代码)浏览:542 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:476 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:4394 |