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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言进阶几分钟带你理解大小端存储模式

    C语言进阶几分钟带你理解大小端存储模式

    这篇文章主要为大家介绍了C语言进阶大小端模式的示例详解,带各位读者朋友五分钟脚踩大小端模式,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02
  • C++实现LeetCode(96.独一无二的二叉搜索树)

    C++实现LeetCode(96.独一无二的二叉搜索树)

    这篇文章主要介绍了C++实现LeetCode(96.独一无二的二叉搜索树),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言return知识点总结

    C语言return知识点总结

    在本篇文章里小编给大家整理的是关于C语言return知识点总结内容,需要的朋友们可以学习参考下。
    2020-02-02
  • DHCP:解析开发板上动态获取ip的2种实现方法详解

    DHCP:解析开发板上动态获取ip的2种实现方法详解

    本篇文章是对开发板上动态获取ip的2种实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言顺序表的基本结构与实现思路详解

    C语言顺序表的基本结构与实现思路详解

    顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。本文将通过示例为大家讲解一下顺序表的基本操作,需要的可以参考一下
    2023-02-02
  • C++中的map使用方法详解

    C++中的map使用方法详解

    C++中的map是一种关联容器,用于存储键值对。它提供了一种非常高效的方法来快速查找特定的值,并且允许我们根据键来排序和遍历数据。在本文中,我们将深入了解C++中的map以及如何使用它来提高程序的效率,感兴趣的朋友可以参考下
    2023-05-05
  • Qt sender()函数的具体使用

    Qt sender()函数的具体使用

    在处理信号时,Qt提供了一个特殊的函数sender(),可以返回发送信号的对象指针,以实现更灵活的代码逻辑,本文就来介绍一下Qt sender()函数的具体使用,感兴趣的可以了解一下
    2024-01-01
  • C++ cin速度优化详解

    C++ cin速度优化详解

    这篇文章主要介绍了C++ cin速度优化详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C语言三子棋的实现思路到过程详解

    C语言三子棋的实现思路到过程详解

    所谓三子棋,就是三行三列的棋盘,玩家可以和电脑下棋,率先连成三个的获胜。这篇文章主要为大家详细介绍了如何通过C语言实现三子棋小游戏,感兴趣的小伙伴可以尝试一下
    2023-02-02
  • C++选择排序算法实例详解

    C++选择排序算法实例详解

    这篇文章主要为大家详细介绍了C++选择排序算法实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12

最新评论