2015年9月10日 星期四

integer <--> char string, float(double) <--> char string

integer -> char string
char * itoa ( int value, char * str, int base );
http://www.cplusplus.com/reference/cstdlib/itoa/

char string -> integer
int atoi (const char * str);
http://www.cplusplus.com/reference/cstdlib/atoi/


float(double) -> char string
char * gcvt ( double value, int ndigits, char * buffer );
http://www.kev.pulo.com.au/pp/RESOURCES/cplusplus/ref/cstdlib/gcvt.html
說明:gcvt()將num轉成ASCII code,ndigits顯示位數。
gcvt()與ecvt()和fcvt()不同的地方在於,gcvt()轉換後的字串包含小數點或正負符號。

char * ecvt(double value, int ndigit, int *decpt, int *sign);
char * fcvt(double value, int ndigit, int *decpt, int *sign);
說明:ecvt把double轉成字串。value要轉換的double,儲存最多ndigit個char,並加('\0')作結尾。如果value數字個數超過ndigit,低位數字被捨入。如果少於ndigit個數字,以'0'填滿。
  只有數字才存儲在該字串中,小數點位置和+-,會存在decpt和sign中。decpt指小數點位置,0或負數指出小數點在第一個數字的左邊。sign指正負符號,正數或0,sign為正數,否則為負數。

  fcvt() 和 ecvt() 的一個不同的地方是第 2 個參數表示的是小數點後顯示的位數,它的轉換也是四捨五入的。fcvt()->全部顯示幾個位數,ecvt()->小數點後面幾個位數


char string -> float(double)
double atof (const char* str);
http://www.cplusplus.com/reference/cstdlib/atof/

scanf(Read formatted data from stream(File *))

Function define: int scanf(const char * format,.......);

Header: #include<stdio.h>

函數說明: scanf()會將輸入的數據根據參數format來轉換並格式化數據

Scanf()格式轉換的一般形式如下
%[*][size][l][h]type

以中括號括起來的參數為選擇性參數,而%與type則是必要的。
* 代表該對應的參數數據忽略不保存。
size 為允許參數輸入的數據長度。
l 輸入的數據數值以long int 或double型保存。
h 輸入的數據數值以short int 型保存。

type的幾種形式
%d 輸入的數據會被轉成一有符號的十進制數字(int)。
%i 輸入的數據會被轉成一有符號的十進制數字,若輸入數據以「0x」或「0X」開頭代表轉換十六進制數字,若以「0」開頭則轉換八進制數字,其他情況代表十進制。
%0 輸入的數據會被轉換成一無符號的八進制數字。
%u 輸入的數據會被轉換成一無符號的正整數。
%x 輸入的數據為無符號的十六進制數字,轉換後存於unsigned int型變量。
%X 同%x
%f 輸入的數據為有符號的浮點型數,轉換後存於float型變量。
%e 同%f
%E 同%f
%g 同%f
%s 輸入數據為以空格字符為終止的字符串。
%c 輸入數據為單一字符(char)。
[] 讀取數據但只允許括號內的字符。如[a-z]。
[^] 讀取數據但不允許中括號的^符號後的字符出現,如[^0-9].

返回值  成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。

Sample:
Read a line
while(EOF != fscanf(streams, "%[^\n]\n", buffer)) {
printf("%s\n", buffer);
}

Read a lot of varibles
while(fscanf(streams, "%d %s %s %s", &d1, &s2, &s3, &s4) != EOF ){
printf("%s\n", s2);
}

Reference:
http://stackoverflow.com/questions/20108334/traverse-file-line-by-line-using-fscanf
http://www.cplusplus.com/reference/cstdio/fscanf/
https://msdn.microsoft.com/zh-tw/library/6ybhk9kc.aspx