sscanf 怎么提取字符串

sscanf 如何提取字符串?


LPCTSTR lpszName = _T("XAUTH-MINUT-11-RTM41-DDDDD-27787");
TCHAR tszBuffer[6];
TCHAR tszBuffertemp[6];
TCHAR tszTimer[6];
memset(tszBuffer,'\0',6);
memset(tszBuffertemp,'\0',6);
memset(tszTimer,'\0',6);
int nRet = 0;
if (3 != (nRet = _stscanf_s(lpszName,_T("%s-%s-%s"),tszBuffertemp,6,tszBuffer,6,tszTimer,6)))
{
return FALSE;
}


这个怎么用? _stscanf_s 怎么用他来提取前面三个? 可以提取不? 不是用 strtol 是用 sscanf函数

------解决方案--------------------
"%s-%s-%s"
改为
"%[^-]-%[^-]-%[^-]"
试试看。
------解决方案--------------------
下面看scanf函数的各种形式。
#include <stdio.h>

int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);

#include <stdarg.h>

int vscanf(const char *format, va_list ap);
int vsscanf(const char *str, const char *format, va_list ap);
int vfscanf(FILE *stream, const char *format, va_list ap);
返回值:返回成功匹配和赋值的参数个数,成功匹配的参数可能少于所提供的赋值参数,返回0表示一个都不匹配,出错或者读到文件或字符串末尾时返回EOF并设置errno
scanf从标准输入读字符,按格式化字符串format中的转换说明解释这些字符,转换后赋给后面的参数,后面的参数都是传出参数,因此必须传地址而不能传值。fscanf从指定的文件stream中读字符,而sscanf从指定的字符串str中读字符。后面三个以v开头的函数的可变参数不是以...的形式传进来,而是以va_list类型传进来。

现在总结一下scanf的格式化字符串和转换说明,这里也只列举几种常用的格式,其它格式请参考Man Page。scanf用输入的字符去匹配格式化字符串中的字符和转换说明,如果成功匹配一个转换说明,就给一个参数赋值,如果读到文件或字符串末尾就停止,或者如果遇到和格式化字符串不匹配的地方(比如转换说明是%d却读到字符A)就停止。如果遇到不匹配的地方而停止,scanf的返回值可能小于赋值参数的个数,文件的读写位置指向输入中不匹配的地方,下次调用库函数读文件时可以从这个位置继续。

格式化字符串中包括:


空格或Tab,在处理过程中被忽略。


普通字符(不包括%),和输入字符中的非空白字符相匹配。输入字符中的空白字符是指空格、Tab、\r、\n、\v、\f。


转换说明,以%开头,以转换字符结尾,中间也有若干个可选项。


转换说明中的可选项有:


*号,表示这个转换说明只是用来匹配一段输入字符,但匹配结果并不赋给后面的参数。


用一个整数指定的宽度N。表示这个转换说明最多匹配N个输入字符,或者匹配到输入字符中的下一个空白字符结束。


对于整型参数可以指定字长,有hh、h、l、ll(也可以写成一个L),含义和printf相同。但l和L还有一层含义,当转换字符是e、f、g时,表示赋值参数的类型是float *而非double *,这一点跟printf不同(结合以前讲的类型转换规则思考一下为什么不同),这时前面加上l或L分别表示double *或long double *型。


常用的转换字符有:


表 25.3. scanf的转换字符







转换字符

描述




d

匹配十进制整数(开头可以有负号),赋值参数的类型是int *。



i

匹配整数(开头可以有负号),赋值参数的类型是int *,如果输入字符以0x或0X开头则匹配十六进制整数,如果输入字符以0开头则匹配八进制整数。



o u x

匹配八进制、十进制、十六进制整数(开头可以有负号),赋值参数的类型是unsigned int *。



c

匹配一串字符,字符的个数由宽度指定,缺省宽度是1,赋值参数的类型是char *,末尾不会添加'\0'。如果输入字符的开头有空白字符,这些空白字符并不被忽略,而是保存到参数中,要想跳过开头的空白字符,可以在格式化字符串中用一个空格去匹配。



s

匹配一串非空白字符,从输入字符中的第一个非空白字符开始匹配到下一个空白字符之前,或者匹配到指定的宽度,赋值参数的类型是char *,末尾自动添加'\0'。



e f g

匹配符点数(开头可以有负号),赋值参数的类型是float *,也可以指定double *或long double *的字长。



%

转换说明%%匹配一个字符%,不做赋值。



下面几个例子出自[K&R]。第一个例子,读取用户输入的浮点数累加起来。


例 25.9. 用scanf实现简单的计算器

#include <stdio.h>

int main(void)  /* rudimentary calculator */
{
double sum, v;

sum = 0;
while (scanf("%lf", &v) == 1)
printf("\t%.2f\n", sum += v);