Re: [問題] sprintf 無法印出字串
※ 引述《mrchildren3 ()》之銘言:
: 大家好 我是新手
: 想請問
: 為何會無法執行
: sprintf 不是將 num 轉成 字串 存到str[2]中嗎
: 謝謝
在C語言中,
字串 就是 字元的"陣列"
本質上就是陣列
陣列的處理往往跟迴圈有關
迴圈必然要有個終止條件,
例如陣列的長度.
跟陣列有關的函式定義基本上也會帶一個資料長度的參數.
例如 string.h 之中的 :
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
void * memcpy ( void * destination, const void * source, size_t num );
而字串處理與一般陣列不同之處可以用下面函式看得出來
int strcmp ( const char * str1, const char * str2 );
char * strcpy ( char * destination, const char * source );
基本上,前二個與後二個函數極度相似,
而後二個或其他字串相關的函式是以'\0'符號做為迴圈終之條件,
所以相較前二個函數省略了一個資料長度的參數.
// ============================
回到原問po的問題,
char str[10]; 這個宣告是個長度為10的字元陣列,
陣列中每個元素( str[0] ~ str[9] )都是單個字元.
而 sprintf() 處理的也是一個陣列,
在 stdio.h 中的定義是這樣:
int sprintf ( char * str, const char * format, ... );
從第一個參數可以看得出來此處傳的是一個位址.
由於在c裡的指標變數可以使用 "[]" 符號做指定位移
跟陣列變數的操作使用 "[]" 極為相似.
例如
char a[10] ;
a[1] = 'z' ;
char * b = a ; // a 同等於 &a[0]
b[2] = 'x' ;
所以雖然傳遞的不是"一整個陣列",
但在實現這個sprintf函式的時候像這個例子,
事實上,雖然 a[i] 跟 b[i] 符號看起來一樣,
但在變數dereference的時候是兩回事
"感覺像"把a陣列傳給b了,
印 b[1] 可印出 'z', 印 a[2] 可印出 'x' .
原po的問題中
: int num = 9;
: sprintf(str[2], "%d", num);
因為 num 為被轉成 "9" 這個字串,
以陣列角度來看就是 { '9','\0' } 實際上是佔了二個字元,
而第一個參數要傳什麼就要看原po想要的程式邏輯是什麼了.
基本上就是要傳地址, 例如 &str[ (某值) ] 或 str (等同&str[0]).
而 str[2] 因為是char ,所以在 type checking 中被檔下來.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.34.3.14
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):