百度
360搜索
搜狗搜索

sscanf正则表达式用法,怎么利用sscanf() 读取字符窜中的整数 VC++?详细介绍

本文目录一览: 关于sscanf()

sscanf("qwewrwr asdg fghj","%[^h]",buf);
这一句用到正则表达式,^h表示凡是不是h字符的所有其他字符
sscanf()读字符串时,参数为"%s",当读到空白字符:空格,TAB,回车等时,完成数据的输入。

c语言关于scanf的问题

你好楼主!
不知道你对正则表达式熟不熟悉?
首先,scanf,sscanf这类输入函数是支持一些简单的正则表达式。scanf("as%s",j); 的正则表达式就是"as%s",即限制输入要从as开始匹配,如果匹配不了,则认为输入错误,即相当于没有输入。如果匹配到as则后面的%s会把输入存放到f这个数组里。你可以试试这样的输入语句scanf("%*[^#]%s", j);它的作用是忽略#这个符号之前的输入,把后面的输入存放到j这个数组里。
其次,接下来的现象是因为j这个数组没有初始化,而当没有有效输入时,输出就是随机的字符。在windos系统下可能会输出“烫烫?”这样的字样

sscanf()什么意思

sscanf() 是C语言中从一个字符串中读进与指定格式相符的数据的函数。
函数原型为:
Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
  int scanf( const char *format [,argument]... );
  说明:
  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的任意字符,贪婪性
sscanf()函数的作用是从字符串中读入数据 ,原型为:
int sscanf(const char *s,const char *format,...);
除了第一个参数外,其余参数的含义与scanf()函数相同,
sscanf()函数将从它的第一个参数读取输入数据而不是从键盘读取。
示例:
char s[]="1 2 3 abc",ts[10];
int a,b,c;
sscanf(s,"%d%d%d%s",&a,&b,&c,ts);
printf("%d %d %d %s",a,b,c,ts);
sscanf()函数将从s中读取三个十进制整数(1,2,3)和一个字符串("abc"),并分别将它们放到a,b,c和字符数组ts中。
应该是scanf(&str[0],"%d",&x);
多写一个s
scanf表示输入,就上你程序执行时用键盘输入的意思
定曰:“十八岁矣。”玄德曰:“既蒙长者厚意,吾弟尚未有子,今即以贤郎为子,若何?”关定大喜,便命关平拜关公为父,呼玄德为伯父。玄德恐袁绍追之,急收拾起行。关平随着关公,一齐起身。关定送了一程自回。
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

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) 致谢了,有了你们才有它啊

阅读更多 >>>  Linux命令解释程序流程

请问一下c语言中能不能用sscanf来区分中文和英文

行。但有好多细节要掌握好,比如sscanf(buffer, "%d %s", &index, name);中buffer里的串必须是第一个是整型数串,而后是空格(可以不至1个),再后是一个字符串。如果不是这样,读取就要出错。区分英文汉语也是可以的;不过没有区分开的必要啊,直接一个字符串“hello,你好”这样也是可行的。
可以的。有个专业的东西叫“正则表达式”,C语言里也可以用类似的东西。
你可以到网上搜下“sscanf高级用法“,有详细的讲解。我在这里只给你举个例子。
#include

int main(void){ char* pstr = "Hello你好123"; char strEn[20]; char strCn[20]; sscanf(pstr, "%[a-zA-Z]%[^a-zA-Z0-9]", strEn, strCn); printf("%s %s\n", strEn, strCn); return 0;}

怎么利用sscanf() 读取字符窜中的整数 VC++?

char buff[512];
sscanf("basis= 24 time is up","%[1-9]",buf); //取出整数
printf("%s\n",buf);
int a=0;
a=atoi(buff); //将数字字符串转化为整数
sscanf()函数用于从字符串中读取指定格式的数据,其原型如下:
int sscanf (char *str, char * format [, argument, ...]);
【参数】参数str为要读取数据的字符串;format为用户指定的格式;argument为变量,用来保存读取到的数据。
【返回值】成功则返回参数数目,失败则返回-1,错误原因存于errno 中。
sscanf()会将参数str 的字符串根据参数format(格式化字符串)来转换并格式化数据(格式化字符串请参考scanf()), 转换后的结果存于对应的变量中。
sscanf()与scanf()类似,都是用于输入的,只是scanf()以键盘(stdin)为输入源,sscanf()以固定字符串为输入源。
【实例】从指定的字符串中读取整数和小写字母。#include

int main(void){ char str[100] ="123568qwerSDDAE"; char lowercase[100]; int num; sscanf(str,"%d %[a-z]", &num, lowercase); printf("The number is: %d.\n", num); printf("The lowercase is: %s.", lowercase); return 0;}

输出结果:

The number is: 123568.

The lowercase is: qwer.

可以看到format参数有些类似正则表达式(当然没有正则表达式强大,复杂字符串建议使用正则表达式处理),支持集合操作,例如:

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

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

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

另外,format不仅可以用空格界定字符串,还可以用其他字符界定,可以实现简单的字符串分割(更加灵活的字符串分割请使用strtok())。例如:

sscanf("2006:03:18", "%d:%d:%d", a, b, c);

sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);

c++中%[^,]是什么意思?

scanf的正则表达式之一。
一般我们是scanf("%s", xxxx),有时我们希望空格也输入进去,可以用scanf("%[^\n]", xxxx)
%[^\n]的意思就是以'\n'作为输入的结束标志。
同理%[^,]就是以','做输入的结束标志。
其它的如
%[a-z] 表示匹配a到z中任意字符
%[aB'] 匹配a、B、'中一员
%[^a] 匹配非a的任意字符
fscanf的用法基本一样。
%[^,]是一个百分号后面跟着的是一个正则表达式,意思是说,读到以逗号作为开头的地方,而后将前面的信息作为一个字符串赋值给相应的变量,例如:
char w[]="123,456";
sscanf(w,"%[^,]",s);
这句话的意思就是从w中读取字符串,读到以逗号作为开头的地方结束
那么最终读到s中的内容就是“123”
这种读入方式在其他情况下同理

请问sscanf和正则表达式的区别?????

sscanf() - 从一个字符串中读进与指定格式相符的数据.
[编辑本段]函数原型:
Int sscanf( const char *, const char *, ...);
int scanf( const char *, ...);
[编辑本段]头文件:
#include

[编辑本段]说明:

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

第一个参数可以是一个或多个 {%[*] [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 表示满足该条件的被过滤掉,不会向目标参数中写入值

//祝你学习进步 有问题可以交流交流

scanf的功能差远了... 另外scanf总体上是倾向于从流中截取内容的,所以也没什么可比性。

java里的Scanner算是scanf更“正则”的版本,同时和正则表达式的区别也更明显了

----

正则表达式的目的是匹配,scanf的目的是截取。scanf的规定是 类型,分隔,类型,分隔;正则是 字符组合,字符组合,字符组合...

完全是两种东西

提取字符串中连续的数字 并将这些数字存放在数组中

#include

void main()

{

char str[]="faghf1235fffy8763u78ii";

char *p=str;

int a[12]={0};

for(int i=0;*p!='\0';p++)

{

if(*p>='0'&&*p<='9')

{

do{

a[i]=a[i]*10+(*p-'0');

p++;

}while((*p>='0'&&*p<='9')&&(*p!='\0'));

i++;

if(*p=='\0')p--;

}

}

for(int j=0;j
<i;j++)
printf("%d ",a[j]);

printf("\n");

}

用sscanf ()库 函数可以实现这个功能了 ,至于这个函数得用法网络上很容易就可以搜到 .

例如sscanf (a ,"%[1-9]",pbuf);

把 字符串 a中得 第一次出现得数字都存入到pbuf缓冲区中.

今天有时间了,特将sscanf函数的具体用法说明如下,希望对你有帮助:

名称:

sscanf() - 从一个字符串中读进与指定格式相符的数据.

函数原型:

Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );

int scanf( const char *format [,argument]... );

头文件:

阅读更多 >>>  c语言输入不定长度的数组,c语言,输入一个长度不定的整型数组(1000位以内),我要怎么知道该数组的长度。

说明:

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的任意字符,贪婪性

例子:

1. 常见用法。

char buf[512] = {0};

sscanf("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

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。(注意:“,”之后有一空格)

sscanf(“hello, world”, "%*s%s", buf);

printf("%s\n", buf);

结果为:world

%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

如果没有空格则结果为NULL。

sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.

</i;j++)

关于字符串比较的问题 VC++2008

if(strstr(str,'P'))
temp=atoi(str+1);
将字符串转化成数之类的常用atoi,atof之类的。sscanf,sprintf也很好用
这个情况可以用sscanf
if (1 == sscanf(str, "P%d", &temp) )
{
// 说明是 "Pn"这个形式, n已经在变量temp里了
} else
{
// 说明是"F"这个形式
}

网站数据信息

"sscanf正则表达式用法,怎么利用sscanf() 读取字符窜中的整数 VC++?"浏览人数已经达到19次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:sscanf正则表达式用法,怎么利用sscanf() 读取字符窜中的整数 VC++?的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!