3.2.5.2 模拟C函数 scanf()功能

在Python里,没有与scanf()直接等同的功能函数,因此需要格式化输入,就需要使用正则表达式的功能来实现,并且正则表达式的功能比scanf()更加灵活,功能更加强大,下面就来列出一些等同的表达:


scanf()格式字符串


正则表达式


%c


.


%5c


.{5}


%d


[-+]?\d+


%e,%E,%f,%g


[-+]?(\d+(\.d*)?|\.\d+)([eE][-+]?\d+)?


%i


[-+]?(0[xX][\dA-Fa-f]+|0[0-7]*|\d+)


%o


[-+]?[0-7]+


%s


\S+


%u


\d+


%x,%X


[-+]?(0[xX])?[\dA-Fa-f]+

输入一个字符串的例子:

/usr/sbin/sendmail - 0 errors, 4 warnings

对于上面格式的字符串,如果使用C函数scanf()来输入,需要使用下面的格式来实现:

%s - %d errors, %d warnings

如果我们使用正则表达式来表示,如下:

(\S+) - (\d+) errors, (\d+) warnings

例子:

print(‘scanf()‘)

pattern = re.compile(r"(\S+) - (\d+) errors, (\d+) warnings")

match = pattern.match(‘/usr/sbin/sendmail - 0 errors, 4 warnings‘)

if match:

print(match.groups())

结果输出如下:

scanf()

(‘/usr/sbin/sendmail‘, ‘0‘, ‘4‘)

%c的例子:

print(‘scanf() %c‘)

pattern = re.compile(r".")

match = pattern.match(‘this is for test\n‘)

if match:

print(match.group())

结果输出如下:

scanf() %c

t

%5c的例子:

print(‘scanf() %5c‘)

pattern = re.compile(r".{5}")

match = pattern.match(‘this is for test\n‘)

if match:

print(match.group())

结果输出如下:

scanf() %5c

this

%e, %E, %f, %g的例子:

print(‘scanf() %e, %E, %f, %g‘)

pattern = re.compile(r"[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?")

match = pattern.match(‘+200.3721\n‘)

if match:

print(match.group())

match = pattern.match(‘x9876\n‘)

if match:

print(match.group())#不匹配没有输出

结果输出如下:

scanf() %e, %E, %f, %g

+200.3721

%i的例子:

print(‘scanf() %i‘)

pattern = re.compile(r"[-+]?(0[xX][\dA-Fa-f]+|0[0-7]*|\d+)")

match = pattern.match(‘0xAA55\n‘)

if match:

print(match.group())

match = pattern.match(‘234.56\n‘)

if match:

print(match.group())

结果输出如下:

scanf() %i

0xAA55

234

八进制的%o的例子:

print(‘scanf() %o‘)

pattern = re.compile(r"[-+]?[0-7]+")

match = pattern.match(‘0756\n‘)

if match:

print(match.group())

match = pattern.match(‘898\n‘)

if match:

print(match.group())#不匹配没有输出

结果输出如下:

scanf() %o

0756

字符串%s的例子:

print(‘scanf() %s‘)

pattern = re.compile(r"\S+")

match = pattern.match(‘深圳是一个小渔村\n‘)

if match:

print(match.group())

match = pattern.match(‘898\n‘)

if match:

print(match.group())

结果输出如下:

scanf() %s

深圳是一个小渔村

898

%u的例子:

print(‘scanf() %u‘)

pattern = re.compile(r"\d+")

match = pattern.match(‘756\n‘)

if match:

print(match.group())

match = pattern.match(‘-898\n‘)

if match:

print(match.group())#不匹配没有输出

结果输出如下:

scanf() %u

756

十六进制%x, %X的例子:

print(‘scanf() %x %X‘)

pattern = re.compile(r"[-+]?(0[xX])[\dA-Fa-f]+")

match = pattern.match(‘0x756\n‘)

if match:

print(match.group())

match = pattern.match(‘-898\n‘)

if match:

print(match.group())#不匹配没有输出

结果输出如下:

scanf() %x %X

0x756

蔡军生 QQ:9073204  深圳

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 10:22:02

3.2.5.2 模拟C函数 scanf()功能的相关文章

创建函数利用可变参数列表的形式模拟实现printf的功能

★创建函数利用可变参数列表的形式模拟实现printf的功能. 模拟简单的输入单个字符和字符串时的输出形式 如:输入:%c %c %c %c %c\t%s,'h','e','l','l','o',"welcome to here!" 输出:h e l l o   welcome to here! #include<stdio.h> #include<stdlib.h> #include<stdarg.h>    //需引入stdarg的头文件以便建立可

在类有成员变量的场景下, 按照虚表原理, 模拟虚函数实现

前言 当类没有成员变量的情况下,   类首地址有4个字节的空间, 这里可以放我们模拟出来的虚表入口地址. 当类有成员变量的情况下, 类首地址就是成员变量,  所以, 为了模拟虚表实现, 需要在成员变量前, 再定义一个int型变量, 用来存放模拟的虚表入口地址. 现在还得不到虚析构函数的地址, 暂时按照非虚析构函数进行模拟. 这个实验是在C++中模拟的. 模拟虚函数实现的用途 在非OOP语言(C语言)中, 模拟类的实现, 可以实现虚函数的效果. 效果 工程下载点 编译环境: vc6sp6 + wi

函数scanf中的*

代码: #include <stdio.h> #include <stdlib.h> int main(void) { int n; // 函数scanf中的*,当被用于%与转换说明符之间时,表示跳过相应的输入项目 scanf("%*d %*d %d", &n); printf("%d\n", n); return EXIT_SUCCESS; } 输入: 100 200 300 输出: 300

【c语言】模拟实现strchr函数,功能:在一个字符串中查找一个字符第一次出现的位置,如果没有出现返回NULL

// 模拟实现strchr函数,功能:在一个字符串中查找一个字符第一次出现的位置,如果没有出现返回NULL #include <stdio.h> #include <assert.h> char const* my_strchr(char const *p,char c) { assert(p != NULL); while (*p) { if (*p == c) return p; else p++; } return NULL; } int main() { char *p =

原创 | 函数 scanf 的前世今生

原创 | 函数 scanf 的前世今生 原文地址:http://blog.51cto.com/vincent040/2140523

C语言:模拟实现printf,要求功能:print(&quot;ccc\ts!&quot;,&#39;b&#39;,&#39;i&#39;,&#39;t&#39;,&quot;welcome to you&quot;);

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <stdarg.h> int my_printf(const char *fmt, ...) { const char *s; char c; va_list ap;//参数列表 va_start(ap, fmt);//取的fmt指针给ap while (*fmt) { /*if (*fmt != 's' |

Matlab中plot函数全功能解析

Matlab中plot函数全功能解析 功能 二维曲线绘图 语法 plot(Y)plot(X1,Y1,...)plot(X1,Y1,LineSpec,...)plot(...,'PropertyName',PropertyValue,...)plot(axes_handle,...)h = plot(...)hlines = plot('v6',...) 描述 plot(Y)如果Y是m×n的数组,以1:m为X横坐标,Y中的每一列元素为Y坐标,绘制n条曲线:如果Y是n×1或者1×n的向量,则以1:n

Delphi中怎样将字符串按给定字符分隔(类似split函数的功能)

Delphi中怎样将字符串按给定字符分隔(类似split函数的功能) 分类:            Delphi2007-05-16 11:094911人阅读评论(2)收藏举报 delphiintegerstringbutton文本编辑function 今天偶尔要做的Delphi程序,其中涉及到了字符串处理,里面有一个功能类似于VB里的split()函数的功能,于是查了很久才查到些资料,现将这些资料整理一下,方便大家. 首先是一个网友自己编的函数.实现了和split()函数的功能. unit U

编写一个程序实现strcpy函数的功能

1 #include <stdio.h> 2 #include <string.h> 3 #define N 5 4 5 6 char *mycpy(char *s1, char *s2) 7 { 8 //数组型 9 /* int i; 10 while(s2[i] != '\0') { 11 s1[i] = s2[i]; 12 i++; 13 } 14 s1[i] = '\0'; 15 return s1; */ 16 //指针型 17 char *p = s1; 18 whil