引用web
茫然 的 兩種將字符串轉換成浮點數的方法
方法一:
char szString[] = "-2876.99812376443";
double db1;
db1 = atof(szString);
printf("atof result:\n");
printf("%f %.12f %.2f %e %E\n", db1, db1, db1, db1, db1);
printf("%.1e %.1E %.18e %.18E\n", db1, db1, db1, db1);
方法二:
char szString2[] = "-2876.99812376443";
double db2;
sscanf(szString2, "%lf", &db2);
printf("\nsscanf result:\n");
printf("%f %.12f %.2f %e %E\n", db2, db2, db2, db2, db2);
printf("%.1e %.1E %.18e %.18E\n", db2, db2, db2, db2);
這兩種方法能夠獲得如出一轍的輸出!輸出以下:
atof result:
-2876.998124 -2876.998123764430 -2877.00 -2.876998e+003 -2.876998E+003
-2.9e+003 -2.9E+003 -2.876998123764430100e+003 -2.876998123764430100E+003
sscanf result:
-2876.998124 -2876.998123764430 -2877.00 -2.876998e+003 -2.876998E+003
-2.9e+003 -2.9E+003 -2.876998123764430100e+003 -2.876998123764430100E+003
不少人對sscanf家族的函數不太瞭解,我想把sscanf家族的函數具體用法寫出來,考試.大但願你們能夠共同進步,有什麼不對的地方歡迎提出來。先瞄下該家族的一些函數原型:
// 從鍵盤輸入數據到變量
int scanf(char *format,...);
// 從字符串輸入數據到變量,以下相同
int sscanf(const char *buffer, const char *format, ... );
int _sscanf_l(const char *buffer, const char *format, locale_t locale, ... );
int swscanf(const wchar_t *buffer,const wchar_t *format, ... );
int _swscanf_l(const wchar_t *buffer,const wchar_t *format,locale_t locale, ... );
下面咱們只看看標準形式的sscanf函數:
int sscanf(const char *buffer, const char *format, ... );
先說說關於它的返回值的問題,庫函數幾乎都是有返回值的,有些人可能很奇怪,怎麼不多人用過sscanf的返回值呢?sscanf會返回成功接收到的變量數量的值。好比sscanf("3.14159","%f",&pi);返回值是1。
測試以下程序:
#include <stdio.h>
int main ()
{
int a;
printf ("%d",scanf("%d\n",&a));
return 0;
}
若是你開始就輸入回車,程序會繼續等待你輸入,由於在輸入數字的時候,scanf會跳過空白字符。the c programming language上說,scanf其實是用getchar()接受由數字組成的字符串,再轉換成數字。若是我輸入ctrl-z(unix上是ctrl-d)則會返回-1(隨編譯器而定).這實際上就是常量EOF的值,也就是所謂的返回eof。若是我鍵入的不是數字返回值就是0。可是若是我輸入浮點數,又會怎麼樣呢?我舉的例子中一樣會返回1,可是緩衝區會留下垃圾,若是是scanf("%d%d",&a,&b);則會出錯。這是可使用一個庫函數fflush(stdin)來清除緩衝。不過貌似雨中飛燕大姐說這個用法是非標準的。K&R,只是說行爲沒有定義,但咱們可使用while((c=getchar())!='\n'&&c!=EOF);一樣能夠清除後面的垃圾scanf的格式匹配仍是比較簡單,必定要記住的就是普通變量必定要加上&,不然編譯器沒法檢測錯誤,但運行確定會段錯誤。
代碼及意義 %a讀浮點值(僅適用於 C99) %A讀浮點值(僅適用於 C99) %c 讀單字符 %d 讀十進制整數 %i 讀十進制、八進制、十六進制整數 %e 讀浮點數 %E 讀浮點數 %f 讀浮點數 %F 讀浮點數(僅適用於 C99) %g 讀浮點數 %G 讀浮點數 %o 讀八進制數 %s 讀字符串 %x 讀十六進制數 %X 讀十六進制數 %p 讀指針值 %n 至此已讀入值的等價字符數 %u 讀無符號十進制整數 %[ ] 掃描字符集合 %%讀 % 符號(百分號) 前面都很簡單,%p,%n不多用到,跳過。要輸入%必需要在前面再加一個%,重點來談談%s和%[]。%s是讀入一個數組,他與gets的區別就在於%s會以任何的空字符結束,而gets是回車結束。一樣%s前能夠加數字,表示只讀多少個。ANSI C 標準向 scanf() 增長了一種新特性,稱爲掃描集(scanset)。 掃描集定義一個字符集合,可由 scanf() 讀入其中容許的字符並賦給對應字符數組。 掃描集合由一對方括號中的一串字符定義,左方括號前必須綴以百分號。 例如,如下的掃描集使 scanf() 讀入字符 A、B 和 C: %[ABC] 使用掃描集時,scanf() 連續吃進集合中的字符並放入對應的字符數組,直到發現不在集合中的字符爲止(即掃描集僅讀匹配的字符)。返回時,數組中放置以 null 結尾、由讀入字符組成的字符串。對於許多實現來講,用連字符能夠說明一個範圍。 例如,如下掃描集使 scanf() 接受字母 A 到 Z: %[A-Z] 重要的是要注意掃描集是區分大小寫的。所以,但願掃描大、小寫字符時,應該分別說明大、小寫字母。對於%[]還能夠用^+任意字符(包括eof)來結束字符串的輸入。好比%[^EOF]就是直到有EOF輸入,字符串才停止。但必定要記住就是c語言是緩衝輸入,即便你%[^a],再你輸入回車以前輸入多少的a都是不可能結束的。%s的輸入會跳過空白字符,可是%c則不會。這也就是 scanf("%d", &h); scanf("%c", &c); 若是這寫的話,變量c放的必定是回車。若是想實現這種輸入,能夠在兩個語句之間加入一個getchar(),他能夠吃掉這個回車,也可用scanf("%d %c",&h,&c);來作,再輸入數字後加一個空格。就能夠了但千萬別用scanf("%d\n", &h); K&R說的十分清楚,任何非格式化的字符都須要徹底匹配。意味着,只有輸入數字後面再加\n纔是合法的。還有就是*加在任何項的前面表示該項不符值。