[問題] printf 和 unsigned char*

看板C_and_CPP作者 (上班族之朝九晚六?!)時間14年前 (2011/05/17 16:10), 編輯推噓3(3022)
留言25則, 9人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC Linux SUSE 問題(Question): 最近在寫C,碰到大量的unsigned char*,然後又得認命的去看內容兼找錯, 只好利用printf來把內容顯示出來看,不過在一連串意外之後, 我對printf越來越陌生了 Q口Q 先直接看下面的測試程式: int int01 = 100; unsigned char *str; unsigned char *tmp; str = (unsigned char *)malloc(1); tmp = (unsigned char *)malloc(2); sprintf(str,"%d",int01); //將int01的數值利用sprintf餵給str memcpy(tmp,str,1); //利用memcpy把數值copy給tmp printf("%d\n",*str); //輸出 49 (神奇的49....不知道哪來的) printf("%u\n",*str); //輸出 49 (unsigned dec和樓上吻合) printf("%x\n",*tmp); //輸出 31 (16進位和樓上吻合) printf("%x\n",*(tmp+1) ); //輸出 0 (第二個byte沒有數值 正確) 想請問大大,要怎麼餵數值給unsigned char*? 輸出49真的讓我有點傻眼,為什麼不是100 >"< 再請問大大,如果我要在unsigned char *str 當中餵入100的二進位(0x1100100) 然後用printf() 顯示出100的話,我該怎麼改? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.251.71.22

05/17 16:16, , 1F
輸出 31 (16進位和樓上吻合) <--- why?
05/17 16:16, 1F

05/17 16:16, , 2F
一個輸出 tmp 一個輸出 str 為什麼會符合呢
05/17 16:16, 2F

05/17 16:17, , 3F
啊沒事我漏看一行...XD
05/17 16:17, 3F

05/17 16:18, , 4F
你是不是誤會了sprintf的用法
05/17 16:18, 4F

05/17 16:18, , 5F
將int01的數值利用sprintf餵給str 何不用下面的方法
05/17 16:18, 5F

05/17 16:18, , 6F
程式結果沒錯,49是'1'這個字元的ASCII Code
05/17 16:18, 6F

05/17 16:18, , 7F
*(str) = (unsigned char)int01 ; // 範圍內不會爆
05/17 16:18, 7F

05/17 16:20, , 8F
printf("%d\n",*str); printf("%u\n",*str);
05/17 16:20, 8F

05/17 16:20, , 9F
以上的用法真的很不建議
05/17 16:20, 9F

05/17 16:20, , 10F
100 只進去了數字1 ascii換回來 剛好是整數49
05/17 16:20, 10F

05/17 16:21, , 11F
參數是only的一對一 並且每個參數型別要非常一致
05/17 16:21, 11F

05/17 16:21, , 12F
printf("%s\n",*str) 應該會出來數字1吧
05/17 16:21, 12F

05/17 16:21, , 13F
所以是....1的ASCII 0.0a 恩
05/17 16:21, 13F

05/17 16:21, , 14F
printf("%d\n",*str);//意思是告訴compiler將str那邊的
05/17 16:21, 14F

05/17 16:22, , 15F
感謝,我了解了 ~"~
05/17 16:22, 15F

05/17 16:22, , 16F
一塊記憶體位置的資料當成"整數"來輸出
05/17 16:22, 16F

05/17 16:23, , 17F
小的生嫩,不足處有請高手補充 ~
05/17 16:23, 17F
※ 編輯: shiengchyi 來自: 60.251.71.22 (05/17 16:30)

05/17 16:48, , 18F
printf 從來就不會顯示變數的原始資料內容,他所印的都是
05/17 16:48, 18F

05/17 16:49, , 19F
轉換成字串後的內容,還在測試怎麼寫時,應該用 Debugger
05/17 16:49, 19F

05/17 16:50, , 20F
自己觀察記憶體每個位元組、每個位元的內容
05/17 16:50, 20F

05/17 17:07, , 21F
恩恩 0.0a 原來是這樣
05/17 17:07, 21F

05/17 17:26, , 22F
還生嫩勒 XD 好像很好吃
05/17 17:26, 22F

05/17 18:18, , 23F
\ ( = oo = ) /
05/17 18:18, 23F

05/18 07:52, , 24F
版主要開動了?
05/18 07:52, 24F

05/18 13:11, , 25F
怎麼覺得怪怪的
05/18 13:11, 25F
文章代碼(AID): #1DqYrz3S (C_and_CPP)