查看完整版本: 請問有關atoi的使用(已解決)
頁: [1]

shiuxiu 發表於 2016-7-20 05:52 PM

請問有關atoi的使用(已解決)

本帖最後由 shiuxiu 於 2016-8-5 02:54 PM 編輯

大家好~
使用atoi拿陣列的值出來要做計算
但因為陣列比較位數太多...直接轉會造成溢位問題
所以傾向於一次只取一位出來轉換計算醬子
char tmp;
char buf;
int sum;
然後
buf=tmp;
sum=atoi(buf);

以上是可以轉出計算的

但想請教一下
因為一次只取一位出來
是否可以改用char buf;醬就好了
實際操作後
buf=tmp;
sum=atoi(buf);
則sum不論如何都為0

可以請教一下各位高手
是不是一定要用陣列接取出來的單一字元呢?
還是說我醬寫哪裡需要修正呢
拜託教教我~
感激~
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

snowflying 發表於 2016-7-20 11:14 PM

編譯不會過吧

atoi 的參數是 const char * str
傳 char 進去,編譯時就會出問題了
而且字串結尾有個 '\0'
不然怎麼知道讀到什麼時候停止呢?

直接轉會造成溢位問題,那麼你是打算如何處理呢
要是最後還是以 int 接,一個一個轉也不會改變什麼
不如自己寫個大數吧

shiuxiu 發表於 2016-7-20 11:53 PM

snowflying 發表於 2016-7-20 11:14 PM static/image/common/back.gif
編譯不會過吧

atoi 的參數是 const char * str


S大您好~
所以我是想確認一下...
是不是不能用char buf;
單一字元去接
一定要用char buf;
這種有給他一個結束字元空間的??

snowflying 發表於 2016-7-21 12:01 AM

shiuxiu 發表於 2016-7-20 11:53 PM static/image/common/back.gif
S大您好~
所以我是想確認一下...
是不是不能用char buf;


我懷疑那個 char 的值,被轉成 const char* 了
所以取到的值是有問題的
因為用法本身就有問題
既然都要一個一個字轉了,就自己用迴圈轉就好
何必呼叫 atoi 呢
溢位的問題還是得另外解決
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

snowflying 發表於 2016-7-21 12:44 AM

本帖最後由 snowflying 於 2016-7-21 12:44 AM 編輯

shiuxiu 發表於 2016-7-20 11:53 PM static/image/common/back.gif
S大您好~
所以我是想確認一下...
是不是不能用char buf;

忘了說,字元 '0' ~ '9' 轉成數值 0~9
減去 '0' 就行了

char c = '8';
int val = c - '0';

<br><br><br><br><br><div></div>

chevylin0802 發表於 2016-7-21 06:52 AM

本帖最後由 chevylin0802 於 2016-7-22 10:45 PM 編輯

單一字串如果是數字
簡單的做法不需要靠atoi

'0'~'9' 的ASCII是0x30~0x39
因此通用的做法則是
再宣告一個變數
int a;
buf宣告改成單一字元
char buf;

直接抓取你想要的陣列值
buf=tmp;
再加上一個判斷式
if( buf >='0' && buf <= '9')
a = (int)( buf-0x30 );
或者 a = (int)( buf-'0' );

不過最主要的是你的tmp陣列似乎沒有先儲存數字字串
因此sum一直都是0



...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

shiuxiu 發表於 2016-7-22 02:03 PM

chevylin0802 發表於 2016-7-21 06:52 AM static/image/common/back.gif
單一字串如果是數字
簡單的做法不需要靠atoi



C大您好~
我的tmp是有輸入資料的
這裡是因為只針對我的疑問所以是沒有交代到資料來源的
所以沒有全部貼出所有程式碼(因為蠻多的)
抱歉讓您誤會了~
另外我想請問一下
我的tmp是
那如果寫buf=tmp;
他怎麼一個個取出資料呢?
還是說要用迴圈一個個去取??

感謝~
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

chevylin0802 發表於 2016-7-22 10:44 PM

本帖最後由 chevylin0802 於 2016-7-22 10:55 PM 編輯

shiuxiu 發表於 2016-7-22 02:03 PM static/image/common/back.gif
C大您好~
我的tmp是有輸入資料的
這裡是因為只針對我的疑問所以是沒有交代到資料來源的
char tmp;的宣告方式是可以的
只是如果你確定你的tmp陣列必需要只是數字字串

我是不知道你的程式的目的是什麼
不過數字字串要轉換成整數值有三種方式
sscanf, atoi以及逐字元轉換
假設你設計的是
char tmp;
char buf;
int val;
buf = tmp;
那麼buf = '\0';是必需要先設的
val = atoi(buf); 才會正常
但是val 會出現的是0~9之間的數值

如果你確定你的陣列都是數字而且你只是要取整個陣列所代表的整數值的話
應該直接就採用val = atoi(tmp); 即可
或者你用sscanf(tmp,"%d", &val);



...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

shiuxiu 發表於 2016-8-5 02:57 PM

我試了之後發現
若要用char buf;的話
就只能用buf-'0'的方式取出數值
若用atoi的話...就一定要用char buf去存取了!!
感謝大家提供方法~
謝謝~
頁: [1]