- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章c语言 sscanf,scanf,fscanf正则表达式用法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
每种语言都对正则表达式有着不同程度的支持,在C语言中,有输入功能的这三个函数对正则表达式的支持并不强大,但是我们还是有必要了解一下.
首先来看看他们的原型:
1
2
3
4
|
#include <stdio.h>
int
scanf
(
const
char
*format, ...);
int
fscanf
(
FILE
*stream,
const
char
*format, ...);
int
sscanf
(
const
char
*str,
const
char
*format, ...);
|
均可以接受变参,sscanf与scanf类似,可以将标准输入(stdin)作为输入源。最关键的部分,就是format这个参数了。它可以是一个或者多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}.
参数解释:
1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中) 。
2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d.
3、width表示读取宽度.
4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size.
5、type : 就是%s,%d之类.
6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值 。
支持的集合操作:%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)%[aB'] 匹配a、B、'中一员,贪婪性%[^a] 匹配非a的任意字符,贪婪性 。
返回值 。
这三个函数返回成功匹配和分配的输入项。意思就是你在format参数列表中的格式,返回值可以比你提供的匹配项目数少(有些将会匹配失败)。提前匹配失败则返回0。如果达到文件末尾,则返回EOF,当发生错误的时候也将返回EOF。你可以通过输出errno来查看错误代码.
如果使用fscanf来判断文件是否结束,将会存在安全隐患,如果每次读取的时候都是匹配失败,那么返回值永远都不会是EOF。scanf族的函数都是要先将数据读入缓冲区,然后在冲缓冲里读取.
注意:scanf族函数会忽略一行开始的空白 。
sscanf/scanf正则用法 。
%[ ] 的用法:
%[ ] 表示要读入一个字符集合 , 如果 [ 后面第一个字符是 ”^” ,则表示反意思.
[ ] 内的字符串可以是 1 或更多字符组成。空字符集( %[] )是违反规定的,可 。
导致不可预知的结果。 %[^] 也是违反规定的.
%[a-z] 读取在 a-z 之间的字符串,如果不在此之前则停止,如 。
1
2
|
char
s[]="hello, my
friend
” ;
// 注意 : , 逗号在不 a-z 之间
sscanf
( s, “%[a-z]”, string ) ;
// string=hello
|
%[^a-z] 读取不在 a-z 之间的字符串,如果碰到 a-z 之间的字符则停止,如 。
1
2
|
char
s[]="HELLOkitty” ;
// 注意 : , 逗号在不 a-z 之间
sscanf
( s, “%[^a-z]”, string ) ;
// string=HELLO
|
%*[^=] 前面带 * 号表示不保存变量。跳过符合条件的字符串.
1
2
3
4
|
char
s[]=
"notepad=1.0.0.1001"
;
char
szfilename [32] =
""
;
int
i =
sscanf
( s,
"%*[^=]"
, szfilename ) ;
// szfilename=NULL, 因为没保存
int
i =
sscanf
( s,
"%*[^=]=%s"
, szfilename ) ;
// szfilename=1.0.0.1001
|
%40c 读取 40 个字符 。
The run-time library does not automatically append a null terminator to the string, nor does reading 40 characters automatically terminate the scanf() function. Because the library uses buffered input, you must press the ENTER key to terminate the string scan. If you press the ENTER before the scanf() reads 40 characters, it is displayed normally, and the library continues to prompt for additional input until it reads 40 characters 。
%[^=] 读取字符串直到碰到 '=' 号, '^' 后面可以带更多字符 , 如:
1
2
3
|
char
s[]=
"notepad=1.0.0.1001"
;
char
szfilename [32] =
""
;
int
i =
sscanf
( s,
"%[^=]"
, szfilename ) ;
// szfilename=notepad
|
如果参数格式是: %[^=:] ,那么也可以从 notepad:1.0.0.1001 读取 notepad 。
使用例子:
1
2
3
4
|
char
s[]=
"notepad=1.0.0.1001"
;
char
szname [32] =
""
;
char
szver [32] = “” ;
sscanf
( s,
"%[^=]=%s"
, szname , szver ) ;
// szname=notepad, szver=1.0.0.1001
|
总结: %[] 有很大的功能,但是并不是很常用到,主要因为:
1 、许多系统的 scanf 函数都有漏洞 . ( 典型的就是 TC 在输入浮点型时有时会出错 ). 2 、用法复杂 , 容易出错 . 3 、编译器作语法分析时会很困难 , 从而影响目标代码的质量和执行效率 . 。
个人觉得第 3 点最致命,越复杂的功能往往执行效率越低下。而一些简单的字符串分析我们可以自已处理.
C语言中scanf(),sscanf(),fscanf()的用法和区别 。
scanf(),sscanf(),fscanf()区别: 第一个是从控制台(键盘)输入; 第二个是从字符串输入; 第三个是从文件输入; scanf scanf()函数根据由format(格式)指定的格式从stdin(标准输入)读取,并保存数据到其它参数. 。
1
2
3
4
5
6
7
8
|
int
main()
{
int
a,b,c;
printf
(
"输入:a,b,c\n"
);
scanf
(
"%d,%d,%d"
,&a,&b,&c);
printf
(
"a = %d b = %d c = %d"
,a,b,c);
return
0;
}
|
sscanf 函数sscanf()和scanf()类似, 只是输入从buffer(缓冲区)中读取. sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源 。
用法: %[ ]表示要读入一个字符集合, 如果[ 后面第一个字符是”^”,则表示反意思。[ ]内的字符串可以是1或更多字符组成。空字符集(%[])是违反规定的,可导致不可预知的结果。%[^]也是违反规定的.
1. 常见用法.
char buf[512] ; sscanf("123456 ", "%s", buf);//此处buf是数组名,它的意思是将123456以%s的形式存入buf中! printf("%s\n", buf); 结果为:123456 。
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串.
sscanf("123456 ", "%4s", buf); printf("%s\n", buf); 结果为:1234 。
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串.
sscanf("123456 abcdedf", "%[^ ]", buf); printf("%s\n", buf); 结果为:123456 。
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串.
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf); printf("%s\n", buf); 结果为:123456abcdedf 当输入: sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf); printf("%s\n",buf); 结果为:123456 。
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串.
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf); printf("%s\n", buf); 结果为:123456abcdedf 。
6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串, 。
先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中 sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); printf("%s\n", buf); 结果为:12DDWDFF 。
7、给定一个字符串“hello, world”,仅保留world.
(注意:“,”之后有一空格,%s遇空格停止,加*则是忽略第一个读到的字符串) sscanf(“hello, world”, "%*s%s", buf); printf("%s\n", buf); 结果为:world %*s表示第一个匹配到的%s被过滤掉,即“hello,”被过滤了 如果没有空格则结果为NULL.
最后此篇关于c语言 sscanf,scanf,fscanf正则表达式用法的文章就讲到这里了,如果你想了解更多关于c语言 sscanf,scanf,fscanf正则表达式用法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在用 C 编写一个函数,它应该从文件中输入有关学生及其成绩的信息。但是,有时在运行程序时,即使输出符合预期,测试也会在 fscanf 处显示分析器错误。 /*structure for grade
如何在 fscanf() 中跳过一个值并转到下一个值?例如,我的输入文件中有以下数据: 11112222 3.95 4 22.5 我应该怎么做才能扫描第二个值? (我想跳过11112222扫描3.95
我正在使用这个 for 循环从纬度和经度坐标文件中引入数据,然后将坐标转换为十进制度数,将度数转换为弧度,然后计算分离角度,并返回两个城市之间的距离。我需要比较文件的前两行,计算距离,打印结果,然后再
我在 while(fscanf != EOF) 循环中执行了一些代码。但是,即使 fscanf 已完成执行,我也需要继续运行该代码,直到满足某些条件。我的意思是我想我可以将代码复制/粘贴到 while
我对 C 语言的文件处理非常陌生,我想问几个问题! 我经常使用 fscanf/fget 将文件转换为不同的格式。不过我不太清楚 fscanf 和 fgets 之间的区别。 特别是,我不确定 fscan
我是 C 的新手,这里有这个简单的代码: int main(int argc, char **argv){ FILE *input = stdin; char string[20];
我已经有了一些使用 fscanf() 读取文本文件的代码,现在我需要修改它,以便以前无空格的字段需要允许空格。文本文件基本上是这样的形式: title: DATA title: DATA etc...
我目前正在开发一个简单的 C 应用程序。它采用单个文件作为命令行参数,其格式如下: 1,2,3 4,5,6 7,8,9 etc. 但是,无论出于何种原因,fscanf 都不会扫描数字!这是一个例子:
我正在尝试读取逗号分隔值格式的文件,程序读取了前两种数据类型,但无法读取最后一种。请帮我一些忙 这是我正在尝试读取的文件中的内容: Jane,50,400.60 代码如下: FILE* fpt
我试图让我的程序从文件中读取输入,但不跳过 fscanf 通常执行的空行。扫描文件的文件和循环是: inFile = fopen("text.txt", "r"); for(i = 0; fsca
我正在尝试从 C 文件中读取数据,该文件将始终以以下类型的行进行格式化: 16 Oct 2013 00:01:00.000,0.000,0.000000 这是一个字符串、一个逗号、一个浮点数、一个逗号
如何格式化 fscanf 来格式化输入{'name surname', 'username', 指向不包含撇号的字符串 fscanf(fp,"{%s %s %d}",name,username,use
我正在尝试使用 fscanf 将文件中的行读取到指向字符数组的指针中。我在打印时遇到段错误。我究竟做错了什么?我应该使用 fscanf 以外的函数吗? #include #include #inc
我有一个制表符分隔文件,我正在尝试将其转换为制表符分隔文件。我正在使用 C。我在尝试读取文件的第二行时遇到了困难。现在我只有数万行重复第一行。 #include #include #define
我正在尝试使用 c 读取一个文件,其中每个变量都由竖线字符分隔。我尝试了以下 fscanf(fp, "%s[|], %s[|], \n", str1, str2); 括号之间的字符是垂直线:竖线字符。
我真的卡在某事上了。 我有一个文本文件,其中有 1 个单词后跟 ~100 个 float 。 float 由空格、制表符或换行符分隔。这种格式在整个文本文件中重复多次。 例如,这是文本文件的样子: o
我想使用 fscanf (使用 gcc 的 C 代码)从文件中解析 ip。所以,我想做: char myip[INET_ADDRSTRLEN]; fscanf(file, "%16s", myip);
while 循环不起作用,我不明白为什么。它没有给我任何错误,但它没有读取任何输入内容。文件内容为: 4 $11$ pelle $2$ pollo $333$ palla $41$ alla 我的代码
我有一些代码,我试图从文件中读取一个集团实例。实例文件中的第一行和第二行分别表示顶点和边的数量。但是我的代码似乎没有正确阅读。这是我的代码中与问题相关的部分: int num_edges=0; int
我正在尝试使用 fscanf 解析一个文本 (CSS) 文件并提取所有匹配此模式的语句: @import "some/file/somewhere.css"; 为此,我设置了以下循环: FILE *f
我是一名优秀的程序员,十分优秀!