sscanf 如何提取字符串?

xengine-qyt 2013-03-06 08:15:54


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函数
...全文
665 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2013-03-07
  • 打赏
  • 举报
回复
Windows的函数还请看MSDN。
# include <stdio.h>

int main()
{
    char * string = "XAUTH-MINUT-11-RTM41-DDDDD-27787";
    char buffer1[16] = "";
    char buffer2[16] = "";
    char buffer3[16] = "";
    sscanf(string, "%[^-]-%[^-]-%[^-]-", buffer1, buffer2, buffer3);
    printf("%s\n", buffer1);
    printf("%s\n", buffer2);
    printf("%s\n", buffer3);

    return 0;
}
pengfoo 2013-03-07
  • 打赏
  • 举报
回复
粘贴效果不太好,自己去看吧,看完你就明白了 http://akaedu.github.com/book/ch25s02.html
pengfoo 2013-03-07
  • 打赏
  • 举报
回复
下面看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); return 0; } 如果我们要读取25 Dec 1988这样的日期格式,可以这样写: char *str = "25 Dec 1988"; int day, year; char monthname[20]; sscanf(str, "%d %s %d", &day, monthname, &year); 如果str中的空白字符再多一些,比如" 25 Dec 1998",仍然可以正确读取。如果格式化字符串中的空格和Tab再多一些,比如"%d %s %d ",也可以正确读取。scanf函数是很强大的,但是要用对了不容易,需要多练习,通过练习体会空白字符的作用。 如果要读取12/25/1998这样的日期格式,就需要在格式化字符串中用/匹配输入字符中的/: int day, month, year; scanf("%d/%d/%d", &month, &day, &year); scanf把换行符也看作空白字符,仅仅当作字段之间的分隔符,如果输入中的字段个数不确定,最好是先用fgets按行读取,然后再交给sscanf处理。如果我们的程序需要同时识别以上两种日期格式,可以这样写: while (fgets(line, sizeof(line), stdin) > 0) { if (sscanf(line, "%d %s %d", &day, monthname, &year) == 3) printf("valid: %s\n", line); /* 25 Dec 1988 form */ else if (sscanf(line, "%d/%d/%d", &month, &day, &year) == 3) printf("valid: %s\n", line); /* mm/dd/yy form */ else printf("invalid: %s\n", line); /* invalid form */ }
AnYidan 2013-03-07
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
"%s-%s-%s" 改为 "%[^-]-%[^-]-%[^-]" 试试看。
++
赵4老师 2013-03-07
  • 打赏
  • 举报
回复
"%s-%s-%s" 改为 "%[^-]-%[^-]-%[^-]" 试试看。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧