看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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