引用 IP电话的原理结构及其关键技术

引用web

茫然    两种将字符串转换成浮点数的方法
  方法一:
  char szString[] = "-2876.99812376443";
  double db1;
  db1 = atof(szString);
  printf("atof result:\n");
  printf("%f %.12f %.2f %e %E\n", db1, db1, db1, db1, db1);
  printf("%.1e %.1E %.18e %.18E\n", db1, db1, db1, db1);
   方法二:
  char szString2[] = "-2876.99812376443";
  double db2;
  sscanf(szString2, "%lf", &db2);
  printf("\nsscanf result:\n");
  printf("%f %.12f %.2f %e %E\n", db2, db2, db2, db2, db2);
  printf("%.1e %.1E %.18e %.18E\n", db2, db2, db2, db2);
  这两种方法能够获得如出一辙的输出!输出以下:
  atof result:
  -2876.998124 -2876.998123764430 -2877.00 -2.876998e+003 -2.876998E+003
  -2.9e+003 -2.9E+003 -2.876998123764430100e+003 -2.876998123764430100E+003
  sscanf result:
  -2876.998124 -2876.998123764430 -2877.00 -2.876998e+003 -2.876998E+003
  -2.9e+003 -2.9E+003 -2.876998123764430100e+003 -2.876998123764430100E+003
  不少人对sscanf家族的函数不太了解,我想把sscanf家族的函数具体用法写出来,考试.大但愿你们能够共同进步,有什么不对的地方欢迎提出来。先瞄下该家族的一些函数原型:
  // 从键盘输入数据到变量
  int scanf(char *format,...);
  // 从字符串输入数据到变量,以下相同
  int sscanf(const char *buffer, const char *format, ... );
  int _sscanf_l(const char *buffer, const char *format, locale_t locale, ... );
  int swscanf(const wchar_t *buffer,const wchar_t *format, ... );
  int _swscanf_l(const wchar_t *buffer,const wchar_t *format,locale_t locale, ... );
  下面咱们只看看标准形式的sscanf函数:
  int sscanf(const char *buffer, const char *format, ... );
  先说说关于它的返回值的问题,库函数几乎都是有返回值的,有些人可能很奇怪,怎么不多人用过sscanf的返回值呢?sscanf会返回成功接收到的变量数量的值。好比sscanf("3.14159","%f",&pi);返回值是1。
  测试以下程序:
  #include <stdio.h>
  int main ()
  {
  int a;
  printf ("%d",scanf("%d\n",&a));
  return 0;
  }
  若是你开始就输入回车,程序会继续等待你输入,由于在输入数字的时候,scanf会跳过空白字符。the c programming language上说,scanf其实是用getchar()接受由数字组成的字符串,再转换成数字。若是我输入ctrl-z(unix上是ctrl-d)则会返回-1(随编译器而定).这实际上就是常量EOF的值,也就是所谓的返回eof。若是我键入的不是数字返回值就是0。可是若是我输入浮点数,又会怎么样呢?我举的例子中一样会返回1,可是缓冲区会留下垃圾,若是是scanf("%d%d",&a,&b);则会出错。这是可使用一个库函数fflush(stdin)来清除缓冲。不过貌似雨中飞燕大姐说这个用法是非标准的。K&R,只是说行为没有定义,但咱们可使用while((c=getchar())!='\n'&&c!=EOF);一样能够清除后面的垃圾scanf的格式匹配仍是比较简单,必定要记住的就是普通变量必定要加上&,不然编译器没法检测错误,但运行确定会段错误。
   代码及意义   %a读浮点值(仅适用于 C99)   %A读浮点值(仅适用于 C99)   %c 读单字符   %d 读十进制整数   %i 读十进制、八进制、十六进制整数   %e 读浮点数   %E 读浮点数   %f 读浮点数   %F 读浮点数(仅适用于 C99)   %g 读浮点数   %G 读浮点数   %o 读八进制数   %s 读字符串   %x 读十六进制数   %X 读十六进制数   %p 读指针值   %n 至此已读入值的等价字符数   %u 读无符号十进制整数   %[ ] 扫描字符集合   %%读 % 符号(百分号)   前面都很简单,%p,%n不多用到,跳过。要输入%必需要在前面再加一个%,重点来谈谈%s和%[]。%s是读入一个数组,他与gets的区别就在于%s会以任何的空字符结束,而gets是回车结束。一样%s前能够加数字,表示只读多少个。ANSI C 标准向 scanf() 增长了一种新特性,称为扫描集(scanset)。 扫描集定义一个字符集合,可由 scanf() 读入其中容许的字符并赋给对应字符数组。 扫描集合由一对方括号中的一串字符定义,左方括号前必须缀以百分号。 例如,如下的扫描集使 scanf() 读入字符 A、B 和 C:   %[ABC]   使用扫描集时,scanf() 连续吃进集合中的字符并放入对应的字符数组,直到发现不在集合中的字符为止(即扫描集仅读匹配的字符)。返回时,数组中放置以 null 结尾、由读入字符组成的字符串。对于许多实现来讲,用连字符能够说明一个范围。 例如,如下扫描集使 scanf() 接受字母 A 到 Z:   %[A-Z]   重要的是要注意扫描集是区分大小写的。所以,但愿扫描大、小写字符时,应该分别说明大、小写字母。对于%[]还能够用^+任意字符(包括eof)来结束字符串的输入。好比%[^EOF]就是直到有EOF输入,字符串才停止。但必定要记住就是c语言是缓冲输入,即便你%[^a],再你输入回车以前输入多少的a都是不可能结束的。%s的输入会跳过空白字符,可是%c则不会。这也就是   scanf("%d", &h);   scanf("%c", &c);   若是这写的话,变量c放的必定是回车。若是想实现这种输入,能够在两个语句之间加入一个getchar(),他能够吃掉这个回车,也可用scanf("%d %c",&h,&c);来作,再输入数字后加一个空格。就能够了但千万别用scanf("%d\n", &h); K&R说的十分清楚,任何非格式化的字符都须要彻底匹配。意味着,只有输入数字后面再加\n才是合法的。还有就是*加在任何项的前面表示该项不符值。
相关文章
相关标签/搜索