全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1509
推到 Plurk!
推到 Facebook!

關於itoa的格式

 
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-08-17 15:01:36 IP:140.127.xxx.xxx 訂閱
各位大大:

itoa此一函式的用法 在我的程式內我誤會他很久了

所以今天把他整理一下跟各位分享

首先如下:


[code cpp]
int text=8;

char texts[8]={0},temps[8]={0};

itoa(text,texts,2);
//會存成 1 0 0 0
'\0' '\0' '\0' '\0' 由陣列0開始填入值 不足的位數以/0補滿
[/code]

第一點
輸出的格式會把沒有用到的位數以 '\0' 表示

第二點
依照二進制的除法由上而下的結果填入陣列
如上例:整數8會以此填入陣列內

[0] = 1
[1] = 0
[2] = 0
[3] = 0
[4] = '\0'
[5] = '\0'
[6] = '\0'
[7] = '\0'

就是這個格式的問題讓我的程式一直跑不出來

因為我的想法就是 如果陣列第0個位置為1的話 也就是[0]=1;

所存放的數值應該是2的零次方 也就是等於1

但是itoa的格式並非我所想像 照原本itoa的格式當我將整數8轉成2進制 經過無失真編碼運算後 用我所說的方式再轉成十進制 質會等於整數1

也正因為是無失真編碼 但是輸出結果卻失真了 回頭找原因才發現是itoa的格式與我所設定的不同

如果有和本人一樣困擾的各位 也請參考小弟以下的作法 也請各位大大提出改進指教

小弟是學影像處理 所以字串長度皆宣告成8


[code cpp]
void itoanorm(char *texts) //將itoa的格式正規化
{
char temps[8]={0};

int fleg=0;
for(int k=8;k>=0;k--)
{
if(texts[k]=='\0')
{
temps[k]='0';
}
else
{
temps[k]=texts[fleg];
fleg ;
}
}

for(k=0;k<9;k )
{
texts[k]=temps[k];
}

}

[/code]


如此一來

原本格式 : 1 0 0 0 '\0' '\0' '\0' '\0'

將會改成此格式 : 0 0 0 0 1 0 0 0

給各位參考
------
恩...
編輯記錄
istillloving 重新編輯於 2010-08-17 15:03:14, 註解 無‧
istillloving 重新編輯於 2010-08-17 15:04:07, 註解 無‧
istillloving 重新編輯於 2010-08-17 15:22:16, 註解 無‧
istillloving 重新編輯於 2010-08-17 15:40:22, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-08-17 16:38:39 IP:122.116.xxx.xxx 訂閱
函式的定義與說明如下
char *itoa(int value, char *string, int radix);
itoa converts value to a null-terminated string and stores the result in string.
所以本來就不會是您預期的結果 ^^

不需要正規化那麼複雜吧^^?
const int len = 8;
BYTEval = 0x08;
BYTE out[len] = {0x00};
for (int i=0; i < len; i ){
if (val&0x01){
out[i] = 1;
}
val>>=1;
}

out裡面就是您要的結果
編輯記錄
taishyang 重新編輯於 2010-08-17 16:43:03, 註解 無‧
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-08-18 11:00:55 IP:140.127.xxx.xxx 訂閱
您好:

請問這是向右shift一個位元嗎 " val>>=1; "



===================引 用 taishyang 文 章===================
函式的定義與說明如下
char *itoa(int value, char *string, int radix);
itoa converts value to a null-terminated string and stores the result in string.
所以本來就不會是您預期的結果 ^^

不需要正規化那麼複雜吧^^?
const int len = 8;
BYTEval = 0x08;
BYTE out[len] = {0x00};
for (int i=0; i < len; i ){
if (val&0x01){
out[i] = 1;
}
val>>=1;
}

out裡面就是您要的結果
------
恩...
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-08-18 11:05:11 IP:122.116.xxx.xxx 訂閱
是的 ^^



===================引 用 istillloving 文 章===================
您好:

請問這是向右shift一個位元嗎 " val>>=1; "


系統時間:2024-04-26 20:12:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!