格式化字符读入与判断scanf()/printf()/sscanf()/sprintf()

版权声明:本文为博主原创文章,转载请务必注明出处和作者,谢谢合作! https://blog.csdn.net/zhanshen112/article/details/84753691

scanf()与printf()很熟悉,其中printf()可以指定输出的格式。

但是如果对于输入,判断是否格式正确再进行存储的时候可以使用sscanf()/sprintf(),这两个函数都在<cstdio>头文件。

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

sscanf()

1、一般用法

1

2

3

char buf[512] = ;

sscanf("123456 ""%s", buf);

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

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

1

2

sscanf("123456 ""%4s", buf);

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

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

1

2

sscanf("123456 abcdedf""%[^ ]", buf);

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

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

1

2

sscanf("123456abcdedfBCDEF""%[1-9a-z]", buf);

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

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

1

2

sscanf("123456abcdedfBCDEF""%[^A-Z]", buf);

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

结果为:123456abcdedf
  6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中

1

2

sscanf("iios/12DDWDFF@122""%*[^/]/%[^@]", buf);

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

结果为:12DDWDFF
  7、给定一个字符串"hello, world",仅保留"world"。(注意:“,”之后有一空格)

1

2

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

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

结果为:world
  P.S. %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了,
  如果没有空格则结果为NULL。 [2] 

sprintf ()

$money = 123.1

$formatted = sprintf ("%06.2f", $money); // 此时变数 $ formatted 值为 "123.10"

$formatted = sprintf ("%08.2f", $money); // 此时变数 $ formatted 值为 "00123.10"

$formatted = sprintf ("%-08.2f", $money); // 此时变数 $ formatted 值为 "123.1000"

$formatted = sprintf ("%.2f%%", 0.95 * 100); // 格式化为百分比

%08.2f 解释:

%开始符

0是 "填空字元" 表示,如果长度不足时就用0来填满。

8格式化后总长度

2f小数位长度,即2位

第3行值为"00123.10" 解释:

因为2f是(2位)+小数点符号(1位)+前面123(3位)=6位,总长度为8位,故前面用[填空字元]0表示,即00123.10

第4行值为"123.1000" 解释:

-号为反向操作,然后填空字元0添加在最后面了

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

实例可以参照:

1054 求平均值——c实现

猜你喜欢

转载自blog.csdn.net/zhanshen112/article/details/84753691