亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求問一下關于sprintf()函數的用法,如下所示~

求問一下關于sprintf()函數的用法,如下所示~

手掌心 2022-02-24 19:15:47
sprintf()函數的用法
查看完整描述

2 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

sprintf的作用是將一個格式化的字符串輸出到一個目的字符串中,而printf是將一個格式化的字符串輸出到屏幕。

sprintf的第一個參數是目的字符串,如果不指定這個參數,執行過程中出現 "該程序產生非法操作,即將被關閉...."的提示。

因為C語言在進行字符串操作時不檢查字符串的空間是否夠大,所以可能會出現數組越界而導致程序崩潰的問題。

即使碰巧,程序沒有出錯,也不要這么用,因為早晚會出錯。所以一定要在調用sprintf之前分配足夠大的空間給buf。

sprintf 是個變參函數,定義如下:

int sprintf( char *buffer, const char *format [, argument] ... );

除了前兩個參數類型固定外,后面可以接任意多個參數。而它的精華,顯然就在第二個參數:格式化字符串上。

printf 和sprintf 都使用格式化字符串來指定串的格式,在格式串內部使用一些以“%”開頭的格式說明符(format specifications)來占據一個位置,在后邊的變參列表中提供相應的變量,最終
函數就會用相應位置的變量來替代那個說明符,產生一個調用者想要的字符串:

格式化數字字符串

sprintf 最常見的應用之一是把整數打印到字符串中,所以,spritnf 在大多數場合可以替代itoa。如:

1>把整數123 打印成一個字符串保存在s 中。

sprintf(s, "%d", 123); //產生"123"

2>可以指定寬度,不足的左邊補空格:

sprintf(s, "%8d%8d", 123, 4567); //產生:" 123 4567"

3>當然也可以左對齊:

sprintf(s, "%-8d%8d", 123, 4567); //產生:"123 4567"

4>也可以按照16 進制打印:

sprintf(s, "%8x", 4567); //小寫16 進制,寬度占8 個位置,右對齊

sprintf(s, "%-8X", 4568); //大寫16 進制,寬度占8 個位置,左對齊

這樣,一個整數的16 進制字符串就很容易得到,但我們在打印16 進制內容時,通常想要一種左邊補0 的等寬格式,那該怎么做呢?很簡單,在表示寬度的數字前面加個0 就可以了。

sprintf(s, "%08X", 4567); //產生:"000011D7"

使用sprintf 的常見問題

sprintf 是個變參函數,使用時經常出問題,而且只要出問題通常就是能導致程序崩潰的內存訪問錯誤,但好在由sprintf 誤用導致的問題雖然嚴重,卻很容易找出,無非就是那么幾種情況,通常用眼睛再把出錯的代碼多看幾眼就看出來了。

1>>緩沖區溢出

第一個參數的長度太短了,沒的說,給個大點的地方吧。當然也可能是后面的參數的問題,建議變參對應一定要細心,而打印字符串時,盡量使用”%.ns”的形式指定最大字符數。

2>>忘記了第一個參數

低級得不能再低級問題,用printf 用得太慣了。

3>>變參對應出問題

通常是忘記了提供對應某個格式符的變參,導致以后的參數統統錯位,檢查檢查吧。尤其是對應”*”的那些參數,都提供了嗎?不要把一個整數對應一個”%s”。


查看完整回答
反對 回復 2022-02-27
?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

sprintf函數的格式:int sprintf( char *buffer, const char *format [, argument,...] );

除了前兩個參數固定外,可選參數可以是任意個。buffer是字符數組名;format是格式化字符串

常用方式

sprintf函數的功能與printf函數的功能基本一樣,只是它把結果輸出到指定的字符串中了,看個例子就明白了:
例:將”test 1 2”寫入數組s中
#include<stdio.h>int main(int argc, char *avgv[])
{
char s[40]; sprintf(s,"%s%d%c","test",1,'2'); /*第一個參數就是指向要寫入的那個字符串的指針,剩下的就和printf()一樣了
你可以比較一下,這是向屏幕輸入*/
printf("%s%d%c","test",1,'2'); return 0;
}12345678910

編譯:
g++ sprinftest.cpp -o sprinftest && ./sprinftest
輸出結果:
sprintftest12
sprintftest12
2.若”%s”等輸出符在字符串中
例:補全字符串str的缺省內容
#include <iostream>#include <stdio.h>#include <cstring>int main(int argc, char *avgv[])
{ char str[] = "hel%co wo%sd! sp%stf test%d"; char buf[strlen(str)]; sprintf(buf, str, 'l', "rl", "rin", 1); std::cout << "str = "<< buf << "\nlen = " << strlen(buf) << std::endl; return 0;
}123456789101112

編譯:
g++ sprinftest.cpp -o sprinftest && ./sprinftest
輸出結果:
str = hello world! sprintf test1
len = 27
這種形式也可以將多個字符值或字符串值賦值到字符串str中,有多少個輸出符就后面就加多少個參數。



查看完整回答
反對 回復 2022-02-27
  • 2 回答
  • 0 關注
  • 225 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號