当前位置:首页 » 编程语言 » c语言sscanf函数

c语言sscanf函数

发布时间: 2022-08-11 09:23:36

① sscanf()什么意思

sscanf,表示从字符串中格式化输入

上面表示从str中,输入数字给x,就是32700
久以前,我以为c没有自己的split string函数,后来我发现了sscanf;一直以来,我以为sscanf只能以空格来界定字符串,现在我发现我错了。

sscanf是一个运行时函数,原形很简单:
int sscanf(
const char *buffer,
const char *format [,
argument ] ...
);
它强大的功能体现在对format的支持上。

我以前用它来分隔类似这样的字符串2006:03:18:
int a, b, c;
sscanf("2006:03:18", "%d:%d:%d", a, b, c);
以及2006:03:18 - 2006:04:18:
char sztime1[16] = "", sztime2[16] = "";
sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);

但是后来,我需要处理2006:03:18-2006:04:18
仅仅是取消了‘-’两边的空格,却打破了%s对字符串的界定。

我需要重新设计一个函数来处理这样的情况?这并不复杂,但是,为了使所有的代码都有统一的风格,我需要改动很多地方,把已有的sscanf替换成我自己的分割函数。我以为我肯定需要这样做,并伴随着对sscanf的强烈不满而入睡;一觉醒来,发现其实不必。

format-type中有%[]这样的type field。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。
%[]类似于一个正则表达式。[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。

所以那个问题也就迎刃而解了:
sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);
在softmse (Jake) 的问题贴http://community.csdn.net/Expert/topic/4843/4843294.xml?temp=.4321558中 ,周星星给出了一个很cool的sscanf用例,而后通过学习,发现sscanf真棒,现做一总结。

原问题:

iios/12DDWDFF@122
获取/和@之间的字符串怎么做
C程序里面有什么函数吗?

周星星的代码:

#include <stdio.h>

int main()
{
const char* s = "iios/12DDWDFF@122";
char buf[20];

sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );

return 0;
}

结果为:12DDWDFF

sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

函数原型:

int scanf( const char *format [,argument]... );
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号},

注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。

width:宽度,一般可以忽略,用法如:

const char sourceStr[] = "hello, world";

char buf[10] = {0};

sscanf(sourceStr, "%5s", buf); //%5s,只取5个字符

cout << buf<< endl;

结果为:hello

{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。

type :这就很多了,就是%s,%d之类。

特别的:

%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:

const char sourceStr[] = "hello, world";

char buf[10] = {0};

sscanf(sourceStr, "%*s%s", buf); //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

cout << buf<< endl;

结果为:world

支持集合操作:

%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)

%[aB'] 匹配a、B、'中一员,贪婪性

%[^a] 匹配非a的任意字符,贪婪性

是不是感觉眼熟了啊,不错,这和正则表达式很相似,而且仍然支持过滤,即可以有%*[a-z].如:

星星大哥例子回顾:

const char* s = "iios/12DDWDFF@122";
char buf[20];

sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );

先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中,cool.得到结果。

PS: 向星星大哥和softmse (Jake) 致谢了,有了你们才有它啊

② 单片机,c语言,sscanf函数的用法

定义几个临时变量会更简单一些,以逗号为分隔,其它的都输入成字符串
比如 sscanf(RX_Buffer, "%s,%s,%lf,%c,%lf,%c", t0, t1, &n, t3, &e, t4);
其中 n e位要求的值 其它的都定义为字符数组即可。

③ c语言 能用sscanf函数提取一行代码中某个字符后面的字符串吗

1、当然能。sscanf相当于格式输入,能够处理任何特殊格式的输入。
2、例如:
#include <stdio.h>
int main()
{
char abd[80]="aaabc.jpg";
char buf1[10],buf2[10];
sscanf(abd, "%[^.].%[^.]", buf1, buf2); //通过ssanf获得文件名及后缀名
printf("buf1=%s buf2=%s",buf1, buf2);
}

④ c语言中关于sscanf函数的运用及%n的用法

代码如下:

#include<stdio.h>

#include<string.h>

int main (){

char s[200];

int n,wei;

memset(s,0,sizeof(s));

while(gets(s)){

int cnt=0,sum=0,num;

char *p=s;

while(sscanf(p,"%d%n",&n,&wei)==1){

sum+=n;cnt++;wei++;

if(p) p+=wei;

}

printf("%d %d ",cnt,sum);

memset(s,0,sizeof(s));

}

return 0;

}

(4)c语言sscanf函数扩展阅读

scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。

scanf()函数返回成功赋值的数据项数,出错时则返回EOF。

其控制串由三类字符构成:

1、格式化说明符;

2、空白符;

3、非空白符;

用空白符结尾时,scanf会跳过空白符去读下一个字符,所以必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以如果用scanf("%d ",&a)也会出现同样的问题。

⑤ 求C语言 fscanf的用法,

你的理解错了,这是将文件中的数据输入到程序中的变量,这个函数是一个输入函数,参考sscanf用法。
sscanf示例如下,得到n=1,sz="asdf"
{
char* str = "1 asdf";
int n;
char sz[10];
sscanf(str, "%d%s", &n, &sz);
printf("%d %s", n, sz);
}
fscanf示例如下,加入pf是指向文件内容为1 asdf的文件指针,得到n=1,sz="asdf"
{
int n;
char sz[10];
sscanf(pf, "%d%s", &n, &sz);
printf("%d %s", n, sz);
}

⑥ C语言如何把11位16进制字符串转成16进制数

#include<stdio.h>

#include<stdlib.h>

voidmain()

{

char*p="0x1b";

char*str;

longi=strtol(p,&str,16);

printf("%d ",i);

}

//输出值为27

参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。当base值为0时则是采用10进制做转换,但遇到如’0x’前置字符则会使用16进制做转换、遇到’0’前置字符而不是’0x’的时候会使用8进制做转换。

(6)c语言sscanf函数扩展阅读

C语言十进制转2~16进制

#include<stdio.h>

voidtrans(intdata,intbase)

{

intx[64],k,i=0;

while(data)

{

x[i]=data%base;

data/=base;

i++;

}

for(k=i-1;k>=0;k--)

if(x[k]<10)

printf("%d",x[k]);

elseif(x[k]<=16)

printf("%c",'A'+x[k]-10);

}

intmain(void)

{

intnum,base;

scanf("%d%d",&num,&base);

if(base<=0||base>16)

{

printf("dataerror ");

return;

}

printf("number=%dbase=%d ",num,base);

trans(num,base);

printf(" ");

return0;

}

⑦ C语言scanf()

有逗号.
你在输入数据的时候,就必须输入逗号,
scanf("%d,%d",&a,&b);
应该输入:
1,2
scanf("%d%d",&a,&b);
这个有点问题吧.
没试过,一般情况下,是需要在中间加一个空格,
类似这样scanf("%d
%d",&a,&b);
然后两个整型以空格为分界.
输入:
1
2(注:中间有空格)
其实这个是scanf本身的一种对字符串的处理.
具体你可以熟悉一下sprintf
sscanf.
他们的原理都是一样的.

⑧ C语言 sscanf函数问题

字符串不长,(1)直接输出就行了。假设你的两个字符串是这样的:char a[]="V2.010A3.124";,那么printf("%c,%c%c%c%c%c %c,%s ",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a+7);就可以了。(2)、(3)可以这么做:

intmain(void){
chara[]="V2.010A3.124";
floatx,y;
sscanf(a,"%*[A-Za-z]%f%*[A-Za-z]%f",&x,&y);
printf("%d%d ",(int)x,(int)y);
return0;
}

⑨ c语言sscanf的问题

sscanf函数,可以 返回成功读入的参数个数。个数为1,表明 读 wert 失败。
char s[]="message \n"; // fgets 读一行,含新行键, 我们可以 预置字符串
static char name[20], wert[20]; // 全局量,保证初始内存清干净了,不含杂乱字符
int N;
N=sscanf(s,"%s%s",name,wert); // 成功读入的参数个数 存入 N
printf("N=%d\n",N); // 输出 N
// N 将得到 1, 因为 %s 格式会略去 空白(空格,新行键)
// 显然,wert 没有读到东西
//打印出来可见
printf("|%s|%s|\n",name,wert);
===
输出:
N=1
|message||

热点内容
用近似归算法 发布:2025-01-21 00:51:56 浏览:517
php显示数据库中图片 发布:2025-01-21 00:44:34 浏览:146
如何在服务器中找文件 发布:2025-01-21 00:38:50 浏览:911
Cmdpython命令 发布:2025-01-21 00:30:38 浏览:758
mac常用解压 发布:2025-01-21 00:01:47 浏览:691
linuxcpu使用 发布:2025-01-21 00:00:59 浏览:849
成套供应配电柜有哪些配置 发布:2025-01-21 00:00:52 浏览:121
GO编译器PDF 发布:2025-01-21 00:00:52 浏览:704
osu上传成绩 发布:2025-01-20 23:59:57 浏览:641
了解sql 发布:2025-01-20 23:58:39 浏览:656