C语言中的sscanf()函数使用

 更新时间:2023年05月17日 16:05:17   作者:faihung  
本文主要介绍了C语言中的sscanf()函数使用,sscanf通常被用来解析并转换字符串,可以实现很强大的字符串解析功能,下面就一起来了解一下

一、描述

sscanf通常被用来解析并转换字符串,其格式定义灵活多变,可以实现很强大的字符串解析功能。

sscanf的原型

#include <stdio.h>
int sscanf(const char *str, const char *format, ...);

str:待解析的字符串;

format:字符串格式描述;

其后是一序列数目不定的指针参数,存储解析后的数据.

二、示例用法

1. sscanf的基本用法

整形数转换

int year, month, day;
int converted = sscanf("20191103", "%04d%02d%02d", &year, &month, &day);
printf("converted=%d, year=%d, month=%d, day=%d/n", converted, year, month, day);

输出结果:

converted=3, year=2019, month=11, day=03

"%04d%02d%02d"是用来解析字符串的格式,%表示格式转换的开始,d表示转换为一个整数,04作为d的修饰,表示这是一个长度为4位的整数,不足4位时以0补齐。

例子返回结果等于3,表示有3个数据成功转换,转换成功数目同时取决于被解析的字符串以及其转换格式,如果我们把例子中的格式改为"%04d%02d",那么sscanf将只返回2,day的数值不会被sscanf更改。

浮点数转换

double longitude, latitude;
int converted = sscanf("113.123456789 31.123456789", "%lf %lf", &longitude, &latitude);
printf("converted=%d, longitude=%.9lf, latitude=%lf/n", converted, longitude, latitude);

输出结果:

converted=2, longitude=113.123456789, latitude=31.123457

sscanf的格式字符串中,f表示这是一个浮点数,其修饰词l表示这是一个double的浮点数。

2. sscanf的高级用法

数字+字符串

char str[32] = "";
sscanf("123456abcdedf", "%31[0-9]", str);
printf("str=%s/n", str);

输出结果:

str=123456

上面的格式中,[0-9]表示这是一个仅包含0-9这几个字符的字符串,前面使用数字31修饰词表示这个字符串缓冲区的最大长度(这也是sscanf最为人诟病的地方,很容易出现缓冲区溢出错误,实际上sscanf是可以避免出现缓冲区溢出的,只要在书写任何字符串解析的格式时,注意加上其缓冲区尺寸的限制)。

char str[32] = "";
sscanf("123456abcdedf", "%31[0-9a-z]", str);
printf("str=%s/n", str);

输出结果:

str=123456abcdedf

在格式[]中增加了a-z的描述。

使用^示例:

char str[32] = "";
sscanf("123456abcdedf", "%31[^a-z]", str);
printf("str=%s/n", str);

输出结果:

str=123456

在[]中增加表示相反的意思,上面的[a-z]表示一个不包含任何a-z之间的字符串。

使用*的例子:

char str[32] = "";
int ret = sscanf("123456abcdedf", "%*[0-9]%31[a-z]", str);
printf("ret=%d, str=%s/n",ret, str);

输出结果:

ret=1, str=abcdedf

加上*修饰表示一个被忽略的数据,同时也不需要为它准备空间存放解析结果。如上面的例子中,我们就只使用了str一个参数存放%31[a-z]的解析结果,而sscanf也只返回1,表示只解析了一个数据。

掌握了[], ^, *如何使用后,我们会发现sscanf原来是一个如此强大的工具,很多我们原先认为必须使用正则表达式的地方,很可能使用sscanf就可以实现。

举例:

1. 取指定长度的字符串

#include<stdio.h>
#include<string.h>
int main()
{
    char str[100];
    sscanf("12345","%4s",str);
    printf("%s\n",str);
    return 0;
}

2. 格式化时间

#include<stdio.h>
#include<string.h>
int main()
{
    int year, month, day, hour, minute, second;
    sscanf("2013/02/13 14:55:34","%d/%d/%d %d:%d:%d",&year, &month, &day, &hour, &minute, &second);
    printf("time=%d-%d-%d %d:%d:%d\n", year, month, day, hour, minute, second);
    return 0;
}

 3. 读入字符串

#include<stdio.h>
#include<string.h>
int main()
{
    char str[100];
    sscanf("12345","%s",str);
    printf("%s\n",str);
    return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
     char str1[100], str2[100], str3[100];
      gets(str1);
      sscanf(str1,"%s%s",str2,str3);
      printf("%s %s\n",str2,str3);
    return 0;
}

4. %*d和%*s加了(*)表示跳过此数据不读入(也就是不把此数据读入参数中)

#include<stdio.h>
#include<string.h>
int main()
{
    char str[100];
    sscanf("1234abcd","%*d%s",str);
    printf("%s\n",str);
    return 0;
}

5.  取到指定字符为止的字符串。如例子所示,遇到‘+’为止的字符串。

#include<stdio.h>
#include<string.h>
int main()
{
    char str[100];
    sscanf("1234+abc","%[^+]",str);
    printf("%s\n",str);
    return 0;
}

遇到空格为止的字符串

#include<stdio.h>
#include<string.h>
int main()
{
    char str[100];
    sscanf("1234+abc1234","%[^]",str);
    printf("str=%s\n",str);
    return 0;
}

 6. 取到指定字符集为止的字符串。如遇到小写字母为止的字符串。

#include<stdio.h>
#include<string.h>
int main()
{
    char str[100];
    sscanf("1234+abc1234","%[^a-z]",str);
    printf("%s\n",str);
    return 0;
}

7. 取仅包含指定字符集的字符串。(取仅包含数字和小写字母的字符串,是取得连续的字符串)。

#include<stdio.h>
#include<string.h>
int main()
{
    char str[100];
    sscanf("123456abcdefBFRGTY7890","%[1-9a-z]",str);
    printf("%s\n",str);
    return 0;
}

到此这篇关于C语言中的sscanf()函数使用的文章就介绍到这了,更多相关C语言 sscanf()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Qt实现视频播放器的制作

    基于Qt实现视频播放器的制作

    本文主要为大家介绍了如何利用Qt中的qMediaPlayer和qvideowidget实现视频文件(avi,mp4….)的播放,并且提供进度显示,还可以通过拖动进度条来变换播放位置,感兴趣的可以尝试一下
    2022-12-12
  • 详解C语言结构体的定义和使用

    详解C语言结构体的定义和使用

    这篇文章主要为大家介绍了C语言结构体的定义和使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • Qt中QTextEdit和QPlainTextEdit控件的实现

    Qt中QTextEdit和QPlainTextEdit控件的实现

    本文主要介绍了Qt中QTextEdit和QPlainTextEdit控件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • C语言结构体数组同时赋值的另类用法

    C语言结构体数组同时赋值的另类用法

    今天小编就为大家分享一篇关于C语言结构体数组同时赋值的另类用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • c语言数据结构与算法之顺序表的定义实现详解

    c语言数据结构与算法之顺序表的定义实现详解

    这篇文章主要介绍了c语言数据结构与算法之顺序表的定义实现详解,用顺序存储的方式实现线性表顺序存储,把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现,需要的朋友可以参考下
    2023-08-08
  • Python HTTP服务搭建显示本地文件

    Python HTTP服务搭建显示本地文件

    这篇文章主要介绍了Python HTTP服务搭建显示本地文件的相关资料,需要的朋友可以参考下
    2017-02-02
  • C++ Primer 多维数组的使用

    C++ Primer 多维数组的使用

    本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • C++高并发内存池的实现

    C++高并发内存池的实现

    本文主要介绍了C++高并发内存池的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • c++数组排序的5种方法实例代码

    c++数组排序的5种方法实例代码

    大家还在为大小排序而烦恼吗?今天让我我大家解决这个问题吧,下面这篇文章主要给大家介绍了关于c++数组排序的5种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • C++实现LeetCode(31.下一个排列)

    C++实现LeetCode(31.下一个排列)

    这篇文章主要介绍了C++实现LeetCode(31.下一个排列),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论