首页 > 其他分享 >(C语言)代码学习||2024.2.6||题目是codewars上的【 IP Validation】

(C语言)代码学习||2024.2.6||题目是codewars上的【 IP Validation】

时间:2024-02-06 21:11:23浏览次数:36  
标签:2024.2 sscanf int IP .% codewars char printf const

C语言 #sscanf #代码学习 #codewars

题目链接:IP Validation | Codewars
代码如下:

#include <stdio.h>

int is_valid_ip(const char *addr)
{
 unsigned n[4], i, nc;
 
 // Must be 4 integers separated by dots:
 if( sscanf(addr, "%d.%d.%d.%d%n", &n[0], &n[1], &n[2], &n[3], &nc) != 4 )
   return 0;
   
 // Leftover characters at the end are not allowed:
 if( nc != strlen(addr) )
   return 0;
   
 // Leading zeros and space characters are not allowed:
 if( addr[0] == '0' || strstr(addr, ".0") || strchr(addr, ' ') )
   return 0;
 
 // Values > 255 are not allowed:
 for(i=0; i<4; i++)
   if( n[i] > 255 )
     return 0;
  
 return 1;
};

首先sscanf()的用法,普通的scanf是从标准输入stdio中获取输入,并通过字符串参数中的格式化占位符来将输入中的字符串内容转化为对应类型的数据,并存通过后面变量列表中传入的地址参数将数据存入到相应的变量中。

sscanf()则只是将输入从标准输入获取改为从某一字符串中获取。菜鸟教程的说法是

C 库函数 **int sscanf(const char str, const char format, ...) 从字符串读取格式化输入。

这个题中是想实现类似下面的效果:

char str[]= "123.34.33.21";
int a[4], b;
sscanf(str, "%d.%d.%d.%d%n", &a[0], &a[1], &a[2], &a[3],&b);
for (int i = 0; i < 4; i++) {
	printf("%d ", a[i]);
}
printf("\n%d", b);
/*输出
123 34 33 21
12
*/

题目中sscanf里还有个%n,并将它的值给了nc。之后将nc的值与字符串addr的长度进行了比较。
%n的作用是获取目前已打印的字符个数,并传递给后面变量列表中对应的变量,正常来说%n是在print()中使用的:

#include <stdio.h>

int main()
{
  int val;
  printf("blah %n blah\n", &val);
  printf("val = %d\n", val);
  return 0;
  /*
  blah  blah
  val = 5
  */
}

但不知道为什么,我自己在VS中运行上面的代码会报错
但在scanf()sscanf()中使用%n就没问题
用到scanf()sscanf()中的作用就是计算已处理的输入字符的个数,并不仅仅是成功传入变量的字符的个数:

#include <stdio.h>
int main() {
	char str[]= "123.34.33.21";
	int a[4], b;
	sscanf(str,"%d.%d.%d.%d%n", &a[0], &a[1], &a[2], &a[3],&b);
	for (int i = 0; i < 4; i++) {
		printf("%d ", a[i]);
	}
	printf("\n%d", b);
	/*输出
	123 34 33 21
	12
	*/
	char str2[]= " 123.34.33.21";
	int a[4], b;
	sscanf(str2,"%d.%d.%d.%d%n", &a[0], &a[1], &a[2], &a[3],&b);
	for (int i = 0; i < 4; i++) {
		printf("%d ", a[i]);
	}
	printf("\n%d", b);
	/*输出
	123 34 33 21
	13
	*/
}

sscanf()本身也有返回值,它会返回存入值成功的变量的个数。

之后排除了数字以0开头的问题

  • char *strstr(const char *haystack, const char *needle)函数,该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。
#include <stdio.h> 
#include <string.h> 
int main() { 
	const char haystack[20] = "RUNOOB"; 
	const char needle[10] = "NOOB"; 
	char *ret; ret = strstr(haystack, needle); 
	printf("子字符串是: %s\n", ret); 
	//子字符串是: NOOB
	return(0);
}

标签:2024.2,sscanf,int,IP,.%,codewars,char,printf,const
From: https://www.cnblogs.com/l25428455/p/18010247

相关文章

  • 2024.2.6每日一题
    LeetCode魔塔游戏LCP30.魔塔游戏-力扣(LeetCode)题目描述小扣当前位于魔塔游戏第一层,共有N个房间,编号为0~N-1。每个房间的补血道具/怪物对于血量影响记于数组nums,其中正数表示道具补血数值,即血量增加对应数值;负数表示怪物造成伤害值,即血量减少对应数值;0表示房间对血量......
  • 2024.2.6
    1.Java不支持多继承但支持多重继承2.继承的特性·子类拥有父类非private的属性、方法·子类可以拥有自己的属性和方法,即子类可以对父类进行扩展·Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如B类继承A类,C类继承B类,所以按照关系就......
  • Oracle~ORA-12505, TNS:listener does not currently know of SID given in connect d
    问题描述ORA-12505,TNS:listenerdoesnotcurrentlyknowofSIDgiveninconnectdescriptorORA-12505:TNS:监听程序当前无法识别连接描述符中所给出的SID问题原因说明给到的sid有误,很有可能就是服务名和SID混淆使用。首先了解数据库url的写法有两种:(1)监听SID,表示SID......
  • nodejs学习计划--(三)http协议和IP介绍
    一、HTPP协议1、概念HTTP(hypertexttransportprotocol)协议;中文叫超文本传输协议是一种基于TCP/IP的应用层通信协议这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。协议中主要规定了两个方面的内容客户端:用来向服务器发送数据,可以被称之为请求报文服务端......
  • JavaScript 实现类似SQL 左联接式的对象数组合并
    在JavaScript中,你可以使用对象合并(Objectmerging)来模拟数据库的左联接操作。左联接操作会将两个对象的特定属性进行合并,类似于SQL中的LEFTJOIN操作。假设你有两个对象,每个对象代表一个表:consttable1=[{id:1,age:30},{id:3,age:25},];consttable2......
  • linux 搜索zip压缩文件内的关键字
    有这样一个场景,一个应用有日志归档,每天新建一个文件夹文件夹里是zip压缩文件             这时候如果程序出现问题,但是不确定是哪一天,需要搜索这些天里的日志文件关键字,这个怎么弄问题比较棘手,经过一番琢磨还是解决了:zgrep'deletefromt_common......
  • 关于pip总是下载到基础环境不下载到虚拟环境
    今天使用pip安装包报错了,使用piplist查询了一下发现竟然默认安装在了基础环境里,我激活了conda的虚拟环境再运行pip依然是安装在了基础环境里,百度后发现解决方法为去除掉系统环境变量里的PYTHONHOME然后使用虚拟环境变量里的虚拟环境变量路径\scripts\pip.exeinstall安装包,实测......
  • 统信UOS操作系统上禁用IPv6
    原文链接:统信UOS操作系统上禁用IPv6hello,大家好啊!继之前我们讨论了如何在麒麟KYLINOS上禁用IPv6之后,今天我要给大家带来的是在统信UOS操作系统上禁用IPv6的方法。IPv6是最新的网络通信协议,但在某些特定的网络环境或测试场景中,可能需要禁用IPv6以确保兼容性或满足其他需求。本文将介......
  • CSP-NOIP游寄
    暑期三周集训:第一周-300pts第二周-700pts第三周-250pts,创造挂分记录。学习了分块、莫队、网络流、树剖、以及一些常用的数据结构维护手法(我怎么这么多算法不会a)。写了赛期计划,在主页上列出了要复习的知识点(然后在NOIP前2天发现90%都不考)。顺便通过LCT学会了splay(雾9-10月份......
  • (python)代码学习||2024.2.4||题目是codewars的【 All Balanced Parentheses】
    题目链接:https://www.codewars.com/kata/5426d7a2c2c7784365000783/pythondefbalanced_parens(n):'''Toconstructallthepossiblestringswithnpairsofbalancedparenthesesthisfunctionmakesuseofastackofitemswiththefoll......