c语言sscanf的头文件,C语言 sscanf用法详解

/* sscanf用法详解 */

#include /* sscanf头文件 */

#include

#include

/*

sscanf 读取格式化的字符串中的数据。

swscanf 是 sscanf 的宽字符版本;swscanf 的参数是宽字符串。 swscanf不处理 Unicode 全角十六进制或"兼容性区"字符。 除此以外,swscanf 和 sscanf 的行为完全相同。

函数语法

int sscanf(const char *str, const char *format, ...);

参数

str

输入源固定字符串

format

格式化参数,format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '/t' | '/n' | 非%符号}

*/

void test()

{

/*

//* 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)

const char *p1 = "abcd123";

char buf1[32] = { 0 };

sscanf(p1, "%*[a-z]%s", buf1); //跳过字母

printf("-- buf1[%s]--\n", buf1);

//[a|b|c]表示a,b,c中选一

const char *p2 = "3b";

char buf2_1[32] = { 0 };

char buf2_2[32] = { 0 };

sscanf(p2, "%[1|2|3]%c", buf2_1, buf2_2); //或运算符使用

printf("-- buf1[%s]--buf2_2[%s]---\n", buf2_1, buf2_2);

//[d],表示可以有d也可以没有d。

const char *p3 = "b";

char buf3_1[32] = { 0 };

char buf3_2[32] = { 0 };

sscanf(p3, "%[3]%c", buf3_1, buf3_2); //无法提取任何数据

printf("-- buf1[%s]--buf2_2[%s]---\n", buf3_1, buf3_2);

//[d],表示可以有d也可以没有d。

const char *p4 = "b";

char buf4_1[32] = { 0 };

char buf4_2[32] = { 0 };

sscanf(p4, "%c%[3]", buf4_1, buf4_2); //可以正常提取b

printf("-- buf1[%s]--buf2_2[%s]---\n", buf4_1, buf4_2);

//结论:sscanf提取字符串必须知道字符串的具体格式,使用上不如正则灵活

//width表示读取宽度。

const char *p5 = "abcdef123";

char buf5_1[32] = { 0 };

char buf5_2[32] = { 0 };

sscanf(p5, "%3s%s", buf5_1, buf5_2); //%3s 表示提取3个字符的字符串

printf("-- buf1[%s]--buf2_2[%s]---\n", buf5_1, buf5_2);

// h|I|I64 是配合%d提取整数使用 L 是配合%f提取浮点数使用,h表示short类型数据,I表示int类型数据,I64表示长整型数据

const char *p6 = "123578abc";

int buf6_1;

char buf6_2[32] = { 0 };

sscanf(p6, "%Id%s", &buf6_1, buf6_2);

printf("-- buf1[%d]--buf2_2[%s]---\n", buf6_1, buf6_2);

//控制字符

// %c 一个单一的字符

// %d 一个十进制整数

// %i 一个整数

// %e, %f, %g 一个浮点数

// %o 一个八进制数

// %s 一个字符串

// %x 一个十六进制数

// %p 一个指针

// %n 一个等于读取字符数量的整数

// %u 一个无符号整数

// %[] 一个字符集

// %% 一个精度符号

const char *p7 = "123578abc";

char ch7 = 0;

char buf7_2[32] = { 0 };

sscanf(p7, "%c%s", &ch7, buf7_2);

printf("-- buf1[%c]--buf2_2[%s]---\n", ch7, buf7_2);

//sscanf函数遇到空格停止读取字符串,所有需要特地注明空格

const char *p8 = "123 578a bc";

char buf8_1[32] = { 0 };

char buf8_2[32] = { 0 };

sscanf(p8, "%s%*[ ]%s", buf8_1,buf8_2); //格式化里有空格,可以提取

printf("-- buf1[%s]--buf2_2[%s]---\n", buf8_1, buf8_2);

//^ 取到指定字符为止的字符串

const char *p9 = "123abc";

char buf9_1[32] = { 0 };

char buf9_2[32] = { 0 };

sscanf(p9, "%[^2]%s", buf9_1,buf9_2);

printf("-- buf1[%s]--buf2_2[%s]---\n", buf9_1, buf9_2);

//截取到指定字符串 "3ab"

const char *p10 = "12-3ab-c";

char buf10_1[32] = { 0 };

char buf10_2[32] = { 0 };

sscanf(p10, "%*[^-]-%[^-]%s", buf10_1, buf10_2);

printf("-- buf1[%s]--buf2_2[%s]---\n", buf10_1, buf10_2);

*/

//%n的使用,返回前一个提取字符个数,一般

const char *p11 = "12345dfg";

int num = 0;

sscanf(p11, "%*d%n%*s", &num);

printf("-- buf1[%d]--buf2[%s]--\n", num, p11 num);//注意其用法,节省内存,通过偏移量展示字符串

}

int main()

{

test();

printf("-----ok------\n");

getchar();

return 0;

}

来源:http://www.icode9.com/content-4-156251.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sscanf函数是C语言中常用的字符串处理函数之一,它的作用是从字符串中读取指定格式的数据。sscanf函数的声明如下: ```c int sscanf ( const char * str, const char * format, ... ); ``` 其中,第一个参数是要读取的字符串,第二个参数是格式化字符串,之后是要读取的变量列表,使用时需要按照格式化字符串中的格式依次提供变量。 例如,以下代码中的sscanf函数将会读取字符串"23 45"中的两个整数,并将它们分别保存在变量a和b中: ```c char str[] = "23 45"; int a, b; sscanf(str, "%d %d", &a, &b); ``` sscanf函数的格式化字符串与printf函数类似,可以使用一系列占位符表示不同类型和格式的数据。常用的占位符如下: - %d 表示读取整数 - %f 表示读取浮点数 - %c 表示读取字符 - %s 表示读取字符串(遇到第一个空格或制表符结束,不包括空格或制表符) - %u 表示读取无符号整数(无符号十进制格式) - %x 或 %X 表示读取十六进制整数 - %[characters] 表示读取指定字符集中的字符,例如%[0-9]表示读取数字字符的序列 除了普通占位符之外,sscanf函数还支持一些特殊格式: - * 表示跳过读取的数据,例如"%*d %d"表示只读取第二个整数 - %n 表示读取到当前位置的字符数,可以用于检测字符串的格式是否与预期相符 需要注意的是,如果sscanf函数无法匹配格式化字符串中的格式,它将会停止读取并返回已经读取的数据数量。此外,如果读取的数据超过了目标变量的类型范围,将会导致数据溢出或类型错误。 总之,sscanf函数是C语言中非常有用的字符串处理函数,它可以方便地从字符串中读取指定格式的数据。在使用时需要注意格式字符串的书写和数据类型的匹配,以避免出现错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值