输入输出_sscanf_sprintf

原创 2007年09月30日 16:04:00

sscanf

 

sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。但新手可能并不知道处理字符串时的一些高级用法,这里做个简要说明吧。

  1. 常见用法。

以下是引用片段:
  char str[512] = {0};
  sscanf("123456 ", "%s", str);
  printf("str=%s/n", str);


  2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

以下是引用片段:
  sscanf("123456 ", "%4s", str);
  printf("str=%s/n", str);


  3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

以下是引用片段:
  sscanf("123456 abcdedf", "%[^ ]", str);
  printf("str=%s/n", str);


  4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。

以下是引用片段:
  sscanf("123456abcdedfBCDEF", "%[1-9a-z]", str);
  printf("str=%s/n", str);


  5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

以下是引用片段:
  sscanf("123456abcdedfBCDEF", "%[^A-Z]", str);
  printf("str=%s/n", str);

 

 

sprintf

 

在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。

sprintf 是个变参函数,定义如下:
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:
格式化字符串上。


printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。

格式化数字字符串
sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代
itoa。

如:
//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
可以指定宽度,不足的左边补空格:
sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
当然也可以左对齐:
sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"
也可以按照16 进制打印:
sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐

这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。
sprintf(s, "%08X", 4567); //产生:"000011D7"
上面以”%d”进行的10 进制打印同样也可以使用这种左边补0 的方式。


这里要注意一个符号扩展的问题:比如,假如我们想打印短整数(short)-1 的内存16 进制表示形式,在Win32 平台上,一个short 型占2 个字节,所以我们自然希望用4 个16 进制数字来打印它:
short si = -1;
sprintf(s, "%04X", si);
产生“FFFFFFFF”,怎么回事?因为spritnf 是个变参函数,除了前面两个参数之外,后面的参数都不是类型安全的,函数更没有办法仅仅通过一个“%X”就能得知当初函数调用前参数压栈时被压进来的到底是个4 字节的整数还是个2 字节的短整数,所以采取了统一4 字节的处理方式,导致参数压栈时做了符号扩展,扩展成了32 位的整数-1,打印时4 个位置不够了,就把32 位整数-1 的8 位16 进制都打印出来了。

如果你想看si 的本来面目,那么就应该让编译器做0 扩展而不是符号扩展(扩展时二进制左边补0 而不是补符号位):
sprintf(s, "%04X", (unsigned short)si);
就可以了。或者:
unsigned short si = -1;
sprintf(s, "%04X", si);


sprintf 和printf 还可以按8 进制打印整数字符串,使用”%o”。注意8 进制和16 进制都不会打

C 和 C++ 的输入输出总结

本文为 C 和 C++ 的各种输入输出做一个总结,对比学习才更有效。欢迎补充。...
  • Lmerissa
  • Lmerissa
  • 2016年01月18日 14:21
  • 2158

操作系统--输入输出--控制方式

输入输出控制方式 一、程序控制方式 1、程序查询  要求CPU不断使用指令检测方法来获取外设工作状态,造成CPU的运行效率极低。 2、程序中断  1、某一外设的数据准备就绪后,它“...
  • xxb2008
  • xxb2008
  • 2014年12月25日 11:59
  • 2047

JAVA最简单的输入输出

一、从命令行输入输出数据 1.向控制台输出数据 标准输出流(System.out)中为人们提供了3种输出方法: 1)print(输出项):实现不换行输出。输出项可以是变量名、常量、表达式。 2)pri...
  • qq_33218411
  • qq_33218411
  • 2017年04月01日 19:57
  • 2125

java输入输出的理解和掌握

1.数据流的基本概念:     数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。数据写入程序可以是一段、一段地向数据流管道中...
  • lwhlwh2012
  • lwhlwh2012
  • 2016年03月25日 17:41
  • 722

java输入输出流

java输入输出流一、什么是IOjava中I/O操作主要指使用java进行输入、输出操作。java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。 java....
  • hulamua
  • hulamua
  • 2016年12月15日 09:51
  • 1037

STM32输入输出模式理解

最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入  (2)GPIO_Mode_IN_FLOATING 浮空输入 ...
  • u011556018
  • u011556018
  • 2017年05月22日 19:03
  • 505

Java 数组的输入输出

Java中要对控制台进行输入操作的话要调用Scanner类,定义一个扫描的对象,例://要导入java.util.Scanner; Scanner scanner = new Scanner(Syst...
  • Joseph_Cherry
  • Joseph_Cherry
  • 2017年03月02日 12:01
  • 407

操作系统之——输入输出系统

I/O系统的基本功能 1. 隐藏物理设备的细节 2. 与设备的无关性 3. 提高处理机和I/O设备的利用率 4. 对I/O设备进行控制 5. 确保对设备的正确共享 6. 错误处理 I/O...
  • qq_26888929
  • qq_26888929
  • 2016年12月04日 10:33
  • 522

Java输入输出流总结

题目:把字符串"1,+,2,+,3,+,4,+,5,-,6,-,7,+,8,-,9"写入D盘,并且计算字符串的值,在控制台打印。 import java.io.File; import java.io...
  • tonehao1990
  • tonehao1990
  • 2015年06月08日 22:09
  • 634

c++ 基础知识(输入输出、namespace命名空间、引用、函数重载模版、内存管理)

===================== 2016-8-27 ===================== 主题:     1.c++输入输出     2.namespace 命名空间  ...
  • gmq_syy
  • gmq_syy
  • 2017年03月20日 17:04
  • 226
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: 输入输出_sscanf_sprintf
举报原因:
原因补充:

(最多只允许输入30个字)