[C] 每天來點字串用法 (6) - atoi()、atol()、atof()

我放棄把每 5 篇合在一起的想法了,那樣文章會變得很長ˊˇˋ
今天要介紹很好用的函式:
  • atoi()、atol():字串轉整數
  所屬標頭檔:<stdlib.h>
  函式宣告:
int atoi( const char *str );
long atol( const char *str );
  首先要注意到:這次的標頭檔並不是我們熟悉的 <string.h>,而是 <stdlib.h>。   這兩是個可以把字串中的有效部分轉換成整數、長整數的函式,而怎麼樣算有效呢?基本上要符合以下條件:
          1) 可能有正負號(+ / -)
          2) 數字
  如果這個字串的開頭有一些空格的話,這兩個函式會自動跳過;而如果在有效部分後面還有一些文字的話(例如小數點),函式將不會理會這些多餘的字。

  • atof():字串轉浮點數
  所屬標頭檔:<stdlib.h>
  函式宣告:
double atof( const char* str );
  這兩是個可以把字串中的有效部分轉換成雙精度浮點數的函式,而怎麼樣算有效呢?基本上要符合以下條件:
          1) 可能有正負號(+ / -)
          2) 數字(可能有小數點)
          3) 可能以「e」、「E」來表示的科學計號
          4) 無限:inf 或 infinity(忽略大小寫)
          5) 非數:NaN(忽略大小寫)
  如果這個字串的開頭有空格的話,這兩個函式會自動跳過;而如果在有效部分後面還有一些文字的話(不含上述提到的記號),函式將不會理會這些多餘的字。

  另外,如果沒辦法轉換的話,atoi()、atol() 會回傳 0,atof() 會回傳 0.0;而如果轉換後超出該型態可儲存的範圍,將會是 undefined behavior。

  範例如下:
#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

int main(){
    const char *str = "  12.34e5trash";
    int i = atoi(str);
    long l = atol(str);
    double d = atof(str);
    cout << i << endl;
    cout << l << endl;
    cout << d << endl;

    return 0;
}
  可以發現 atoi() 和 atol() 都讀到小數點就停下來了,而 atof() 則是讀到後面的 trash 才停止。

這次的篇幅有點短,原本想放入 strtol() 的,但是怕太長,而且我懶得一次打那麼多東西,所以就作罷了XD

參考資料:
  1) cppreference - atoi、atolcppreference - atof
  2) 我懶惰的腦袋

留言

這個網誌中的熱門文章

[C] 每天來點字串用法 (2) - strcpy()、strncpy()

[Python] *args 和 **kwargs 是什麼?一次搞懂它們!

[C] 每天來點字串用法 (5) - strcat()、strncat()