1.输入一个IP地址字符串(支持16进制和10进制),判断ip是否合法,例如ip为“192.1.0.1”返回ture,ip为“266.266.266.1”,返回false.

实现函数:int  checkIP(const char *str);

程序代码如下


#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>static  int  isString_Hex(char *p)
{int  ret = 0;if (p == NULL){ret = 0;}else{while (*p){if (((*p >= 'a') && (*p <= 'f')) || ((*p >= 'A') && (*p <= 'F'))){ret = 1;break;}else{ret = 0;}p++;}}return ret;}/***
***:checkIP
***Function:判断ip地址是否合法
***Input:  str   IP地址
***Output: TRUE 合法FALSE 不合法
****/
int  checkIP(const  char *str)
{//const char * str 表示其指针所指向的内容是只读的,不能被修改//ip地址默认采用IPv4的点分十进制法,合法地址为0.0.0.0-255.255.255.255int  ret = 0;const char * split = ".";char *str1 ;char * p;int  seg_num = 0;int  ip[10] = {0};long  num = 0;int i = 0;int correct = 0;/*char* strtok (char* str,constchar* delimiters );函数功能:切割字符串,将str切分成一个个子串函数参数:str:在第一次被调用的时间str是传入需要被切割字符串的首地址;在后面调用的时间传入NULL。delimiters:表示切割字符串(字符串中每个字符都会 当作分割符)。函数返回值:当s中的字符查找到末尾时,返回NULL;如果查不到delimiter所标示的字符,则返回当前strtok的字符串的指针。*/if (str == NULL){printf("str is null\n");ret = 0;}else{str1 = malloc(strlen(str) + 1);strcpy(str1, str);//1.分割字符串p = strtok(str1, split);while (p != NULL) {//2.判断字符串是否为16进制,若为16进制返回10进制,否则直接转换为整型if (isString_Hex(p)){//字符串为16进制,转换为十进制/* strtol converts string to long integer */num = strtol(p,NULL, 16);}else{//字符串为10进制num = strtol(p, NULL, 10);}printf("p:%s      ", p);ip[seg_num] = num;printf("ip[seg_num]=%ld\n", ip[seg_num]);seg_num++;p = strtok(NULL, split);}if (seg_num == 4){for (i = 0; i < seg_num; i++){if ((ip[i] >= 0) && (ip[i] <= 255))correct++;}if (correct == 4){ret = 1;}else{ret = 0;}}else{ret = 0;}}return ret;
}int  main()
{char str[] = "f.e.a.c";int  ret = 0;ret=checkIP(str);if (ret == 0){printf("IP  无效\n");}else if (ret == 1){printf("IP  有效\n");}printf("hello\n");system("pause");return  0;
}

运行结果如下:



程序代码分析:

1.ip地址的格式为xx.xx.xx.xx,由3个‘.’隔开,因此,按照字符‘.’分割字符串,分割字符串使用c库函数strtok.

strtok详解:

函数原型:char strtok(char *str,const char * delimiters);

函数功能:

strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。

函数参数;

str:在第一次调用时str需要传入被切割字符的首地址,在后面调用时间传入NULL.

delimiter:表示切割字符串(字符串中的每个字符都会当做分割符)。

函数返回值:

从str开头开始的一个个被分割的串。当str中的字符查找到末尾时,返回NULL。

如果查找不到delimiters中的字符时,返回当前strtok的字符串的指针。

所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。

2.判断每个分割的字符串是否为16进制;

若字符串为16进制,转换为10进制,再转换为整型。

若字符串为10进制,转换为整型,

字符串转换为长整型使用c库函数strtol

long  int strtol(const char * nptr,char **endptr,int base);

函数功能:strtol()会将nptr指向的字符串,根据参数base,安全转换为long  int,然后返回这个值。

参数base的范围为2-26和0,它决定了字符串以被转换为整数的权值。

可以被转换的合法字符依据base而定,举例来说,当base为2时,合法字符为‘0’,‘1’;base为8时,合法字符                                  为‘0’,‘1’,……‘7’;base为10时,合法字符为‘0’,‘1’,……‘9’;base 为16时,合法字符为‘0’,‘1’,……‘9’,‘a’,                       ……‘f’;strtol()函数检测到第一个非法字符时,立即停止检测,其后所有的字符都会被当做非法字符处理。合法的字符                 串会转换为long int,作为函数的返回值。非法字符串即从第一个非法字符的地址,被赋给*endptr.**endptr是个双重指针,                 即指针的指针。strtol()函数就是通过它改变*endptr的值,即把第一个非法字符的地址传给endptr.

多数情况下,endptr设置为NULL, 即不返回非法字符串。

3.判断分割的子串个数,和字符‘.’的个数

若分割的子串个数为4个,'.'是3个,符合ip规范,且每个子串的10进制数在0-255之间,则输入的ip地址为有效的ip地址;

其他情况的ip均为无效ip.

cvte2019校园招聘嵌入式编程题1详解相关推荐

  1. 搜狗2016校园招聘之编程题解析-大数据开发

    搜狗2016校园招聘之编程题解析-大数据开发 解题思路: 使用JDK中的Point2D类,该类定义了坐标系空间中的一个点 Point2D是一个抽象类,但是在该类内部定义了静态的Double类,并且Do ...

  2. 奇虎360_2017校园招聘笔试编程题第一题

    今晚做了360的校招笔试题,编程题难度适中,在这里跟大家分享一下编程题的第一题. 1. 题目 2. 输入输出及样例 3. 我的思路 这题应该看题目理解一下就有思路,最简单粗暴的就是创建一个二维数组in ...

  3. 奇虎360_2017校园招聘笔试编程题第二题

    今晚做了360的校招笔试题,编程题难度适中,在这里跟大家分享一下编程题的第二题.第二道题也不难想到思路,但是如果写法不当,可能无法满足题目的时间限制. 1. 题目 2. 输入输出及样例 3. 我的思路 ...

  4. 魔法王国java_网易2018校园招聘面试编程题真题与参考答案集合

    [编程题] 魔法币 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币. 魔法机器1: ...

  5. 腾讯2021校园招聘技术类编程题汇总

    第一题 代码: '''author: 'Qingmang'data: "2022/9/8 16:26"email: "1107438760@qq.com" '' ...

  6. 奇虎360 2015校园招聘笔试编程题

    题目一: 写一个函数,根据两文件的绝对路径算出相对路径. 如a="/qihoo/app/a/b/c/d/new.c",b="/qihoo/app/1/2/test.c&q ...

  7. 腾讯2020校园招聘-后台 编程题

    小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为[m|S](m为一个整数且1&l ...

  8. 滴滴 2019校园招聘笔试编程题-2018.09.18

    输入: slep slap sleep step shoe shop snap slep 输出: slep slap step 代码是交卷后写出来的,没有经过测试,不知道是否能够AC 利用DP求出每个 ...

  9. 京东2015校园招聘笔试编程题

    题目一: 请编写一个函数func,输入一个正整数n,返回一个最小的正整数m(m>9,即m至少包含两位数),使得m的各位乘积等于n,例如输入36,输出49:输入100,输出455,如果对于某个n不 ...

最新文章

  1. 准备IE--复习NP,NP从头开始,每天学一点,就多一点收获
  2. 小码哥iOS学习笔记第八天: block的底层结构
  3. Greasemonkey——打造自己的互联网
  4. PHP的display_errors与error_reporting
  5. 多C++标准版本指定
  6. 面向普通人的 PHP 加密
  7. 谁说 Java 要过时?2017 年 Java 大事件回顾!
  8. 简要解析红外摄像机技术与市场
  9. mxnet入门--第6篇
  10. JQuery实战图片特效-遁地龙卷风
  11. Access2016学习3
  12. Windows11系统中便签小工具在哪 便签使用方法简单图解
  13. 基于某电信运营数据的精准营销分析
  14. 第二周——学习内存取证神器volatility的使用
  15. 解决Springboot2.X,无法用HttpSession报错org.apache.tomcat.websocket.server.WsSessionListener.sessionCreated
  16. 哨向 Mika Lelush 1
  17. 七月与安生:不管选择哪条路,都会是辛苦的 — —豆瓣老丑
  18. 使用Grunt和GulpJavaScript工作流自动化
  19. win10 cpu anaconda环境安装torch
  20. 浅谈VMware Workstation Pro 使用Linux系统(超详细教程)

热门文章

  1. 唯品会双11大促技术保障实践
  2. html前端课讲项目特效,前端特效demo | 值得收藏的6个 HTML5 Canvas 实用案例
  3. fullcalendar 日程插件demo使用
  4. 安卓工程师教你玩转Android
  5. DDE简单实现动态数据交换 仅能获取实时tick数据,无法获取历史K线
  6. 谷歌2012年I/O
  7. 三年级教师计算机教学计划,三年级信息技术教学计划
  8. catch that cow java_POJ3278 Catch That Cow
  9. NYOJ 139 我排第几个(康托展开)
  10. 东北大学计算机组成原理实验四,东北大学计算机组成原理实验报告(12页)-原创力文档...