作者shiengchyi (上班族之朝九晚六?!)
看板C_and_CPP
標題[問題] printf 和 unsigned char*
時間Tue May 17 16:10:35 2011
開發平台(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
→ uranusjr:輸出 31 (16進位和樓上吻合) <--- why? 05/17 16:16
→ uranusjr:一個輸出 tmp 一個輸出 str 為什麼會符合呢 05/17 16:16
→ uranusjr:啊沒事我漏看一行...XD 05/17 16:17
推 chchwy:你是不是誤會了sprintf的用法 05/17 16:18
→ abzxcx:將int01的數值利用sprintf餵給str 何不用下面的方法 05/17 16:18
→ chchwy:程式結果沒錯,49是'1'這個字元的ASCII Code 05/17 16:18
→ abzxcx:*(str) = (unsigned char)int01 ; // 範圍內不會爆 05/17 16:18
→ abzxcx:printf("%d\n",*str); printf("%u\n",*str); 05/17 16:20
→ abzxcx:以上的用法真的很不建議 05/17 16:20
→ CCWck:100 只進去了數字1 ascii換回來 剛好是整數49 05/17 16:20
→ abzxcx:參數是only的一對一 並且每個參數型別要非常一致 05/17 16:21
→ CCWck:printf("%s\n",*str) 應該會出來數字1吧 05/17 16:21
→ shiengchyi:所以是....1的ASCII 0.0a 恩 05/17 16:21
→ abzxcx:printf("%d\n",*str);//意思是告訴compiler將str那邊的 05/17 16:21
→ shiengchyi:感謝,我了解了 ~"~ 05/17 16:22
→ abzxcx:一塊記憶體位置的資料當成"整數"來輸出 05/17 16:22
→ abzxcx:小的生嫩,不足處有請高手補充 ~ 05/17 16:23
※ 編輯: shiengchyi 來自: 60.251.71.22 (05/17 16:30)
推 purpose:printf 從來就不會顯示變數的原始資料內容,他所印的都是 05/17 16:48
→ purpose:轉換成字串後的內容,還在測試怎麼寫時,應該用 Debugger 05/17 16:49
→ purpose:自己觀察記憶體每個位元組、每個位元的內容 05/17 16:50
→ shiengchyi:恩恩 0.0a 原來是這樣 05/17 17:07
→ loveme00835:還生嫩勒 XD 好像很好吃 05/17 17:26
→ abzxcx:\ ( = oo = ) / 05/17 18:18
推 xatier:版主要開動了? 05/18 07:52
→ angleevil:怎麼覺得怪怪的 05/18 13:11