C语言中的sscanf和sprintf常见用途

 更新时间:2025年09月20日 09:14:38   作者:yuyousheng_  
sscanf和sprintf是C语言中用于字符串与数据转换的函数,类似scanf/printf但处理字符串而非输入输出流,本文给大家介绍C语言中的sscanf和sprintf常见用途,感兴趣的朋友一起看看吧

sscanfsprintf 是 C 语言中非常重要的两个标准库函数,它们都定义在 <stdio.h> 头文件中。这两个函数可以看作是 scanfprintf 的“非交互式”版本,即它们不直接与用户的键盘和屏幕进行输入输出,而是与**字符串(字符数组)**进行数据的读取和写入。

1. sprintf 函数

sprintf 的功能类似于 printf,但它不是将格式化的数据输出到屏幕,而是输出到一个字符串(字符数组)中

函数原型

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

参数说明

  • str: 指向一个字符数组的指针,用于存储格式化后的字符串。
  • format: 格式控制字符串,与 printf 中的格式字符串相同(如 %d, %f, %s 等)。
  • ...: 可变参数列表,是要格式化的变量。

返回值

  • 成功时,返回写入到 str 中的字符数量(不包括末尾的 \0)。
  • 如果发生错误,返回一个负数。

示例

#include <stdio.h>
int main() {
    char buffer[100];
    int age = 25;
    float height = 1.78;
    char name[] = "Alice";
    // 将多个变量格式化为一个字符串
    sprintf(buffer, "Name: %s, Age: %d, Height: %.2f", name, age, height);
    printf("Formatted string: %s\n", buffer);
    // 输出:Formatted string: Name: Alice, Age: 25, Height: 1.78
    return 0;
}

常见用途

  • 构造动态字符串(如日志信息、SQL 查询语句等)。
  • 数值转换为字符串(例如 intchar*)。
  • 字符串拼接。

⚠️ 注意安全问题:使用 sprintf 时必须确保目标缓冲区 str 足够大,否则会发生缓冲区溢出,导致程序崩溃或安全漏洞。推荐使用更安全的替代函数 snprintf

2. sscanf 函数

sscanf 的功能类似于 scanf,但它不是从标准输入(键盘)读取数据,而是从一个字符串中按指定格式提取数据

函数原型

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

参数说明

  • str: 指向要解析的源字符串。
  • format: 格式控制字符串,描述如何从 str 中提取数据。
  • ...: 可变参数列表,通常是变量的地址(用 &),用于存储提取的数据。

返回值

  • 成功匹配并赋值的输入项数量。
  • 如果在任何数据被成功读取前就发生匹配失败,返回 EOF

示例

#include <stdio.h>
int main() {
    char input[] = "John 30 1.75";
    char name[50];
    int age;
    float height;
    // 从字符串中解析姓名、年龄和身高
    int result = sscanf(input, "%s %d %f", name, &age, &height);
    if (result == 3) {
        printf("Name: %s, Age: %d, Height: %.2f\n", name, age, height);
        // 输出:Name: John, Age: 30, Height: 1.75
    } else {
        printf("Parsing failed!\n");
    }
    return 0;
}

高级用法示例

char line[] = "Date: 2023-10-05, Temperature: 23.5C";
int year, month, day;
float temp;
// 提取日期和温度
sscanf(line, "Date: %d-%d-%d, Temperature: %fC", &year, &month, &day, &temp);
printf("Year: %d, Month: %d, Day: %d, Temp: %.1f°C\n", year, month, day, temp);

常见用途

  • 解析配置文件或日志行。
  • 从用户输入的字符串中提取结构化数据。
  • 字符串分割和类型转换。

总结对比

函数数据流向类比函数主要用途
sprintf变量 → 字符串printf格式化数据存入字符串
sscanf字符串 → 变量scanf从字符串中解析并提取结构化数据

安全建议

由于 sprintf 容易导致缓冲区溢出,强烈建议使用 snprintf 替代 sprintf

int snprintf(char *str, size_t size, const char *format, ...);

snprintf 多了一个 size 参数,指定目标缓冲区的大小,可以有效防止溢出。

同样,虽然 sscanf 相对安全,但也要注意格式字符串和目标变量类型的匹配,避免未定义行为。

掌握 sscanfsprintf 能让你在处理字符串和数据转换时更加灵活高效,是 C 语言编程中的必备技能。

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

相关文章

  • 定义vim配置文件vimrc用于c/c++编程

    定义vim配置文件vimrc用于c/c++编程

    vim作为Linux下广受赞誉的代码编辑器,其独特的纯命令行操作模式可以很大程度上方便编程工作,通过自定义vim配置文件可以实现对vim功能的个性化设置。这篇文章主要介绍了定义vim配置文件vimrc,用于c/c++编程 ,需要的朋友可以参考下
    2018-10-10
  • 详解C++中类的六大默认成员函数

    详解C++中类的六大默认成员函数

    这篇文章主要介绍了C++类中的六大默认成员函数的原理雨使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • 详解C语言正确使用extern关键字

    详解C语言正确使用extern关键字

    这篇文章主要介绍了C语言正确使用extern关键字,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 解决C语言中使用scanf连续输入两个字符类型的问题

    解决C语言中使用scanf连续输入两个字符类型的问题

    这篇文章主要介绍了解决C语言中使用scanf连续输入两个字符类型的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C++ 引用折叠(Reference Collapsing)的具体使用

    C++ 引用折叠(Reference Collapsing)的具体使用

    本文主要介绍了C++ 引用折叠使用,,引用折叠主要在模板类型推导、auto、decltype等场景中发生,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-05-05
  • 一文详解C++的程序流程控制

    一文详解C++的程序流程控制

    这篇文章主要介绍了一文详解C++的程序流程控制,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • C语言实现简单回声服务器

    C语言实现简单回声服务器

    这篇文章主要为大家详细介绍了C语言实现简单回声服务器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++实用库之DNS解析的实现

    C++实用库之DNS解析的实现

    DNS解析是一种将域名转换为相应的IP地址的过程,本文主要介绍了C++实用库之DNS解析的实现,实现了快速、准确的域名到IP地址的转换,感兴趣的可以了解一下
    2025-03-03
  • 带你搞懂C++ LeeCode 二叉树的中序遍历

    带你搞懂C++ LeeCode 二叉树的中序遍历

    中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树
    2021-07-07
  • tinyxml 常用的C++ XML解析器非常优秀

    tinyxml 常用的C++ XML解析器非常优秀

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好
    2012-11-11

最新评论