Re: [問題] sprintf 無法印出字串

看板C_and_CPP作者 (Lance)時間11年前 (2013/02/16 18:38), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/3 (看更多)
※ 引述《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
文章代碼(AID): #1H7s6CiL (C_and_CPP)
文章代碼(AID): #1H7s6CiL (C_and_CPP)