關於itoa函式使用到時候犯的錯誤

2021-06-20 10:58:26 字數 1160 閱讀 3719

函式原型:

char* itoa(int value, char* buf, int  radix);

value:要轉換的引數

buf:轉換後儲存的空間

radix:按radix進製轉換

在使用的時候發現了乙個問題,以前沒關注過,如下:

char temp;

int a = 1;

itoa(a, &temp, 10);   //將a==1按10進製轉換後存入temp

結果報錯資訊:run-time check failure #2 - stack around the variable 'temp' was corrupted.

執行時棧錯誤,後來經過查詢發現是itoa轉換後要在buf最後新增null結束符,而temp只是乙個字元,這就導致null新增不成功!

正確的做法是:

char temp[2];

int a = 1;

itoa(a, temp, 10);

這樣就對了,但是當把a改為兩位數後有可能會有錯誤,因為轉換後的每個數字都要佔乙個char的位置,也就是說如果a==1234,那麼temp大小必須至少是5個,即四個數字加乙個null結束符。

如果a為負數呢,假設a == -1067,那麼temp大小應該為多少呢? 實際上temp大小應該再加1,因為

temp[0]儲存的是符號('-'),如下圖所示:

那麼如果是正數有沒有符號位呢? 單步發現只有負數前面才有符號位,所以結論如下:

如果val為正數,則buf大小應該為val位數加1,末位為null位;

如果val為負數,則buf大小應該為val位數加2,buf[0]為負號,末位為null位。

切記!ps:vs2010下使用itoa顯示該warning c4996: 'itoa': the posix name for this item is deprecated. instead, use the iso c++ conformant name: _itoa. see online help for details.

即該函式itoa過時了,應該使用iso c++ conformant函式名 _itoa, 在使用_itoa時有提示可能不安全,讓使用_itoa_s。

Oracle中使用到的函式

1.字串相關 1 查詢字串 insrt函式 對指定字串進行判斷,判斷其是否含有指定的字元 instr 源字串 目標字串 開始位置 第幾次出現 用於模糊查詢以及判斷包含關係 select code,name,dept,occupation from staff where instr code,001...

php使用到的函式記錄一

birthdate 2010 1 1 6個月之後的時間 waydate date y m d strtotime 6 months strtotime birthdate 複製 array search 在陣列中搜尋給定的值,如果成功則返回首個相應的鍵名 sprintf return a forma...

Oracle使用到的一些函式

2.trim 函式 去除字串兩端的空格 3.length 函式 統計字串的長度 4.case when else end as 5.decode函式 decode value,if1,then1,if2,then2,if3,then3,else 6.substr 函式 substr string s...