欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言中的sscanf和sprintf常見用途

 更新時間:2025年09月20日 09:14:38   作者:yuyousheng_  
sscanf和sprintf是C語言中用于字符串與數(shù)據(jù)轉(zhuǎn)換的函數(shù),類似scanf/printf但處理字符串而非輸入輸出流,本文給大家介紹C語言中的sscanf和sprintf常見用途,感興趣的朋友一起看看吧

sscanfsprintf 是 C 語言中非常重要的兩個標(biāo)準(zhǔn)庫函數(shù),它們都定義在 <stdio.h> 頭文件中。這兩個函數(shù)可以看作是 scanfprintf 的“非交互式”版本,即它們不直接與用戶的鍵盤和屏幕進(jìn)行輸入輸出,而是與**字符串(字符數(shù)組)**進(jìn)行數(shù)據(jù)的讀取和寫入。

1. sprintf 函數(shù)

sprintf 的功能類似于 printf,但它不是將格式化的數(shù)據(jù)輸出到屏幕,而是輸出到一個字符串(字符數(shù)組)中。

函數(shù)原型

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

參數(shù)說明

  • str: 指向一個字符數(shù)組的指針,用于存儲格式化后的字符串。
  • format: 格式控制字符串,與 printf 中的格式字符串相同(如 %d, %f, %s 等)。
  • ...: 可變參數(shù)列表,是要格式化的變量。

返回值

  • 成功時,返回寫入到 str 中的字符數(shù)量(不包括末尾的 \0)。
  • 如果發(fā)生錯誤,返回一個負(fù)數(shù)。

示例

#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;
}

常見用途

  • 構(gòu)造動態(tài)字符串(如日志信息、SQL 查詢語句等)。
  • 數(shù)值轉(zhuǎn)換為字符串(例如 int 轉(zhuǎn) char*)。
  • 字符串拼接。

?? 注意安全問題:使用 sprintf 時必須確保目標(biāo)緩沖區(qū) str 足夠大,否則會發(fā)生緩沖區(qū)溢出,導(dǎo)致程序崩潰或安全漏洞。推薦使用更安全的替代函數(shù) snprintf。

2. sscanf 函數(shù)

sscanf 的功能類似于 scanf,但它不是從標(biāo)準(zhǔn)輸入(鍵盤)讀取數(shù)據(jù),而是從一個字符串中按指定格式提取數(shù)據(jù)。

函數(shù)原型

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

參數(shù)說明

  • str: 指向要解析的源字符串。
  • format: 格式控制字符串,描述如何從 str 中提取數(shù)據(jù)。
  • ...: 可變參數(shù)列表,通常是變量的地址(用 &),用于存儲提取的數(shù)據(jù)。

返回值

  • 成功匹配并賦值的輸入項數(shù)量。
  • 如果在任何數(shù)據(jù)被成功讀取前就發(fā)生匹配失敗,返回 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);

常見用途

  • 解析配置文件或日志行。
  • 從用戶輸入的字符串中提取結(jié)構(gòu)化數(shù)據(jù)。
  • 字符串分割和類型轉(zhuǎn)換。

總結(jié)對比

函數(shù)數(shù)據(jù)流向類比函數(shù)主要用途
sprintf變量 → 字符串printf格式化數(shù)據(jù)存入字符串
sscanf字符串 → 變量scanf從字符串中解析并提取結(jié)構(gòu)化數(shù)據(jù)

安全建議

由于 sprintf 容易導(dǎo)致緩沖區(qū)溢出,強(qiáng)烈建議使用 snprintf 替代 sprintf

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

snprintf 多了一個 size 參數(shù),指定目標(biāo)緩沖區(qū)的大小,可以有效防止溢出。

同樣,雖然 sscanf 相對安全,但也要注意格式字符串和目標(biāo)變量類型的匹配,避免未定義行為。

掌握 sscanfsprintf 能讓你在處理字符串和數(shù)據(jù)轉(zhuǎn)換時更加靈活高效,是 C 語言編程中的必備技能。

到此這篇關(guān)于C語言中的sscanf和sprintf常見用途的文章就介紹到這了,更多相關(guān)C語言 sscanf和sprintf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言進(jìn)階幾分鐘帶你理解大小端存儲模式

    C語言進(jìn)階幾分鐘帶你理解大小端存儲模式

    這篇文章主要為大家介紹了C語言進(jìn)階大小端模式的示例詳解,帶各位讀者朋友五分鐘腳踩大小端模式,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • C++實現(xiàn)LeetCode(96.獨一無二的二叉搜索樹)

    C++實現(xiàn)LeetCode(96.獨一無二的二叉搜索樹)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(96.獨一無二的二叉搜索樹),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言return知識點總結(jié)

    C語言return知識點總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于C語言return知識點總結(jié)內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • DHCP:解析開發(fā)板上動態(tài)獲取ip的2種實現(xiàn)方法詳解

    DHCP:解析開發(fā)板上動態(tài)獲取ip的2種實現(xiàn)方法詳解

    本篇文章是對開發(fā)板上動態(tài)獲取ip的2種實現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言順序表的基本結(jié)構(gòu)與實現(xiàn)思路詳解

    C語言順序表的基本結(jié)構(gòu)與實現(xiàn)思路詳解

    順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲。本文將通過示例為大家講解一下順序表的基本操作,需要的可以參考一下
    2023-02-02
  • C++中的map使用方法詳解

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

    C++中的map是一種關(guān)聯(lián)容器,用于存儲鍵值對。它提供了一種非常高效的方法來快速查找特定的值,并且允許我們根據(jù)鍵來排序和遍歷數(shù)據(jù)。在本文中,我們將深入了解C++中的map以及如何使用它來提高程序的效率,感興趣的朋友可以參考下
    2023-05-05
  • Qt sender()函數(shù)的具體使用

    Qt sender()函數(shù)的具體使用

    在處理信號時,Qt提供了一個特殊的函數(shù)sender(),可以返回發(fā)送信號的對象指針,以實現(xiàn)更靈活的代碼邏輯,本文就來介紹一下Qt sender()函數(shù)的具體使用,感興趣的可以了解一下
    2024-01-01
  • C++ cin速度優(yōu)化詳解

    C++ cin速度優(yōu)化詳解

    這篇文章主要介紹了C++ cin速度優(yōu)化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C語言三子棋的實現(xiàn)思路到過程詳解

    C語言三子棋的實現(xiàn)思路到過程詳解

    所謂三子棋,就是三行三列的棋盤,玩家可以和電腦下棋,率先連成三個的獲勝。這篇文章主要為大家詳細(xì)介紹了如何通過C語言實現(xiàn)三子棋小游戲,感興趣的小伙伴可以嘗試一下
    2023-02-02
  • C++選擇排序算法實例詳解

    C++選擇排序算法實例詳解

    這篇文章主要為大家詳細(xì)介紹了C++選擇排序算法實例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論