引用 IP電話的原理結構及其關鍵技術

2022-03-08 05:51:44 字數 3529 閱讀 3711

引用

茫然

兩種將字串轉換成浮點數的方法

方法一:

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

int main ()

如果你開始就輸入回車,程式會繼續等待你輸入,因為在輸入數字的時候,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才是合法的。還有就是*加在任何項的前面表示該項不符值。

IP電話的通訊方式與IP電話原理

現在使用的普通 採用線路交換方式,而 internet 則採取報文交換方式,因此internet 通過pstn時,在internet與pstn之間需經過話音閘道器轉換,轉換成符合internet傳輸的ip資料報文,並遵循tcp ip協議傳輸。internet 的通訊方式分為3種 pc to pc p...

IP電話的呼叫過程

ip 的呼叫過程 整個ip 的呼叫流程可分為3部分 連線階段 通話階段 拆線階段。1 建立連線階段 在空閒狀態下,cpu一直迴圈檢測是否有摘機或其它使用者呼入的訊號。使用者摘機時,cpu檢測到摘機訊號,就傳送撥號音給使用者並準備接收使用者所撥的 號碼。待號碼收齊後,cpu給伺服器傳送arp請求,收到...

燒錄光碟的結構及原理

市面上銷售的計算機軟體光碟或cd vcd 等各種格式光碟是壓制的cd rom 光碟 compact disc read only memory 燒錄機所使用的燒錄盤是cd r 盤和cd rw 盤。壓制盤與燒錄盤的製造方式不同,碟片結構略有差異,但資料儲存原理是一樣的。在著手燒錄光碟之前,我們需要了解...